Как правило, для моих шаблонных классов я включаю объявления в файл .hpp, а код реализации шаблона — в файл .t.hpp. Я явно создаю экземпляр класса в файле .cpp:
template class MyClass< AnotherClass >;
чей объектный код помещается в библиотеку.
Проблема в том, что если я попытаюсь напечатать объект с operator<<, который объявлен в файле .hpp и определен в файле .t.hpp как:
template<class T>
std::ostream& operator<<( std::ostream& os, const MyClass<T>& c)
{
os << "Hello, I am being output.";
return os;
}
Я получаю сообщение об ошибке компоновщика о том, что правильный символ не определен.
Я понимаю, что это связано с тем, что эта шаблонная функция не создается явно, когда класс. Есть ли способ обойти это, кроме как включать файл .t.hpp каждый раз, когда я хочу использовать operator<< в классе, или перемещать шаблонный код функции в файл .hpp? Могу ли я явно создать экземпляр кода функции?