“Неопределенные символы” ошибка компоновщика с простым шаблонным классом

Я использовал код от @Michael Shang и имел все виды противоречивого поведения при отображении HUD. Оказывается, использование последнего окна ненадежно, так как клавиатура iOS может просто его скрыть. Так что в большинстве случаев вы должны получить окно, используя AppDelegate, как упомянуто @David Lawson.

Вот как в Swift:

let window = UIApplication.sharedApplication().delegate!.window!!
let hud = MBProgressHUD.showHUDAddedTo(window, animated: true)

Однако, с учетом вышеизложенного ваш HUD будет отображаться за клавиатурой iOS (если они перекрываются). Если вам нужен HUD для наложения клавиатуры, используйте последний метод окна.

В моем случае я показываю HUD, затем вызываю resignFirstResponder(), немедленно скрывая окно, в которое был добавлен HUD. Так что это то, о чем нужно знать, единственное окно, которое гарантированно остается рядом, - это первое.

Я закончил тем, что создал метод, который при необходимости мог бы добавить HUD над клавиатурой:

func createHUD(size: CGSize, overKeyboard: Bool = false) -> MBProgressHUD {
    let window = overKeyboard ? UIApplication.sharedApplication().windows.last!
                              : UIApplication.sharedApplication().delegate!.window!!
    let hud = MBProgressHUD.showHUDAddedTo(window, animated: true)
    hud.minSize = size
    hud.bezelView.style = .SolidColor
    hud.bezelView.color = UIColor(white: 0, alpha: 0.8)
    return hud
}
15
задан Flexo 3 May 2012 в 18:43
поделиться

2 ответа

Определение шаблона (файл cpp в вашем коде) должно быть включено до создания экземпляра данного класса шаблона, поэтому вам нужно либо включить определения функций в заголовок, либо # включить cpp перед использованием класса (или выполните явные экземпляры, если их количество ограничено).

23
ответ дан 1 December 2019 в 02:29
поделиться

Работает включение файла cpp, содержащего реализации функций класса шаблона. Однако, ИМХО, это странно и неудобно. Наверняка должен быть более изящный способ сделать это?

Если у вас есть только несколько разных экземпляров для создания и вы знаете их заранее, вы можете использовать «явное создание экземпляров»

Это работает примерно так:

Вверху gene.cpp добавьте следующие строки

template class Gene<int>;
template class Gene<float>;
4
ответ дан 1 December 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: