Рассмотрим следующий код:Неопределенная ссылка на функцию-член шаблона базового класса
myclass.h:
template <class T>
struct S {
void f();
};
struct MyClass : public S<int>
{
void g();
};
myclass.cpp:
#include "myclass.h"
#include <iostream>
template <class T>
void S<T>::f()
{
std::cout << "f()\n";
/* some code here that could not be in header */
}
void MyClass::g()
{
std::cout << "g()\n";
}
main.cpp:
#include "myclass.h"
int main()
{
MyClass m;
m.g();
m.f(); // problem here
}
У меня есть линкер ror:
undefined reference to `S::f()'
Можно ли решить эту проблему без передачи реализации файла S :: f() в заголовочный файл? Почему S :: f() не создается при объявлении MyClass из полного специализированного базового класса шаблонов?
Возможный дубликат [Почему шаблоны могут быть реализованы только в файле заголовка?] (Http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header- file) – molbdnilo
Код, который не должен быть в заголовке, может ли он быть помещен в статическую или глобальную (не шаблонную) функцию? Или с использованием, например, [pimpl idiom] (http://en.wikipedia.org/wiki/Opaque_pointer)? –