// это вспомогательный класс, нет смысла его выносить отдельно
class Foo
{
};
class TestClass
{
public:
explicit TestClass() {}
virtual ~TestClass() {}
template<typename T>
void f_test(void) {}
};
Требуется запустить из другого класса функцию f_test. Делаем:
TestClass *tc = new TestClass();
tc->f_test<Foo>();
delete tc;
Всё работает.
Однако, если класс testClass раскидать по двум файлам (cpp и hpp) то, при попытке сборки, выскочит ошибка: undefined reference to `void TestClass::f_test<Foo>()'
Почему так?
Мудрость приходит с возрастом.
Иногда возраст приходит один. Digital Art
Однако, если класс testClass раскидать по двум файлам (cpp и hpp) то, при попытке сборки, выскочит ошибка: undefined reference to `void TestClass::f_test<Foo>()'
Почему так?
Как именно раскидать? Все шаблоны должны быть доступны там, где они инстанциируются. Если Вы перенесли определение шаблона в cpp, а инклюдите hpp, то компилятор его не найдёт.
Все шаблоны должны быть доступны там, где они инстанциируются. Если Вы перенесли определение шаблона в cpp, а инклюдите hpp, то компилятор его не найдёт.
Похоже, что именно так. Попробовал перенести тело функции в hpp, убрав его из cpp - работает. Хотя, как то это неуклюже.
Может есть более изящное решение?
Мудрость приходит с возрастом.
Иногда возраст приходит один. Digital Art
Можно использовать явное инстанциирование шаблона в том же модуле, где он определён, но у меня пальцы не поворачиваются назвать это более изящным решением.
Можно использовать явное инстанциирование шаблона в том же модуле, где он определён, но у меня пальцы не поворачиваются назвать это более изящным решением.
А это как? Можете пример привести?
P.S. Мне код в hpp не нравится тем, что он будет 100500 раз собираться. Ровно столько, сколько "инклюдится" сам hpp. По той же причине, мне не нравятся языки типа C# - крупные проекты собираются/пересобираются слишком долго и толком с этим ничего не сделать.
Мудрость приходит с возрастом.
Иногда возраст приходит один. Digital Art
Мне код в hpp не нравится тем, что он будет 100500 раз собираться.
Есть такое дело, да. Есть и лекарство от него — PCH (precompiled headers), но это тоже то ещё уродство.
Но Вы что, думаете, STL и прочие библиотеки шаблонов как-то по-другому работают?