通常对于我的模板类,我在 .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
文件?我可以显式实例化函数代码吗?
最佳答案
您可以显式实例化函数模板
template std::ostream& operator<<(std::ostream&, const MyClass<int>&);
使用 T = int
实例化特化。如果可以推导出所有模板参数(例如,从类型 MyClass<int>
推导出来),则可以省略模板参数括号。如果不能,例如因为模板参数不会出现在函数参数类型中,则可以明确指定它
template<typename T> void f() { }
template void f<int>();
关于c++ - 模板化运算符<<显式实例化和 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1013979/