syxme
@syxme

Почему не работает dynamic_cast?

code.h
template <class T>
	T findViewById(const char* strId);


code.cpp
template<class T>
	T Activity::findViewById(const char* strId) {
		return dynamic_cast<T>(mWindow->findViewById(strId));
	}

main.cpp
text = findViewById<TextView*>("button_text");
Ошибка

undefined reference to `WEngine::TextView* WEngine::Activity::findViewById(char const*)


Если что findViewById возвращает базовый класс
TextView наследник
  • Вопрос задан
  • 193 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Определение функции шаблона должно быть inline в .h файле (вставьте код из code.cpp в code.h).

Ну, или в code.cpp файле добавьте куда-то строку
findViewById<WEngine::TextView*>;

Это все потому, что в C++ архаичная система хедеров. Когда компилится main.cpp, он не видит определения метода, только декларацию из code.h. Когда компилится code.cpp, он не знает, что main понадобится инстанциирование шаблона с каким-то типом. Поэтому не создает его. А потом линкер уже ругается, что не может найти функцию.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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