Я использую C++, и у меня проблемы с шаблонами extern. В отличие от C#, в C++ вся реализация шаблона действительно неприятна :(
template_test.hpp
template<class T>
class CFoo {
public:
T Foo_Func(const T& test);
};
template_test.cpp
#include "Template_Test.hpp"
template<class T>
T CFoo<T>::Foo_Func(const T& test)
{
return test;
}
template_test2.hpp
#include "Template_Test.hpp"
extern template class CFoo<int>;
int Template_Tests();
template_test2.cpp
#include "Template_Test2.hpp"
int Template_Tests()
{
CFoo<int> foo_instance;
//this causes an undefined reference
int res = foo_instance.Foo_Func(1);
return res;
}
почему компоновщик не находит мою функцию. Я думал, что шаблоны extern работают так же, как и внешние переменные.
(Поместите extern int test; в файл заголовка и int test = 0 в исходный файл.)
Спасибо за вашу поддержку:)
Вам не хватает template class CFoo<int>; в template_test.cpp.
Возможный дубликат Почему шаблоны могут быть реализованы только в файле заголовка?





Один из способов решить эту проблему - реализовать функцию класса шаблона без определений функций. в таком случае:
template<class T>
class CFoo {
public:
T Foo_Func(const T& test) {
return test;
}
};
И тогда вам даже не понадобится деталь extern. Я знаю, что ваше программистское чутье постоянно говорит вам избегать этого и всегда разделять определения функций вашего класса и их реализацию, но в случае с шаблоном в C++ это самое простое решение огромной проблемы этого языка.
Важная вещь, о которой вам нужно знать, - существует большая разница между решениями этой проблемы в разных IDE, но это простое решение работает в большинстве из них (если не всегда).
Другой вариант, если вы все еще хотите отделить реализации от определений, вы можете включить файл .cpp, а также файл .hpp / .h:
template_test2.hpp
#include "Template_Test.hpp"
#include "Template_Test.cpp"
/*extern template class CFoo<int>;*/ // Again, you don't need this extern
int Template_Tests();
Это наиболее близкий к тому способ, который вы пробовали. в конце файла template_test.cpp добавьте следующую строку:
template class CFoo<int>;
и удалите строку extern template class CFoo<int>; из файла template_test2.hpp.
Надеюсь, тебе это поможет, Корел.
спасибо за этот действительно полезный пост. Подумав о плюсах и минусах каждого решения, я решил перейти к решению 1. На мой взгляд, оно предлагает наибольшую гибкость. :)
Обычно я тоже использую его, но иногда у вас действительно большой класс шаблонов, и тогда я предпочитаю использовать третье решение. Рад помочь :)
связанные / обман: stackoverflow.com/questions/495021/…