我有一个类,在头部定义为:
template <typename T> class MyClass
{
template <typename U> friend std::ostream& operator<<(std::ostream& output, const MyClass<U>& p);
public:
...
}
在实现文件中,我有:
template <typename U> std::ostream& operator<<(std::ostream& output, const MyClass<U>& m)
{
output << "Some stuff";
return output;
}
这一切看起来都很干净。但是,当我尝试使用此运算符(即 std::cout
Undefined symbols: std::basic_ostream<char, std::char_traits<char> >& operator<< <InnerType>(std::basic_ostream<char, std::char_traits<char> >&, MyClass<InnerType> const&)
我很惊讶编译器没有自动为我生成这个...关于我做错了什么有什么建议吗?
在实现文件中,我有:
那就是问题所在。您不能在标头文件和实现文件之间拆分模板定义。由于模板的性质,C++ 编译器在这里很挑剔。定义标头中的所有代码以使其正常工作。
事实上,这里的问题是所有模板定义必须驻留在同一个编译单元中,因为 C++ 标准没有定义如何在不同单元之间共享模板信息。这些单元由链接器拼接在一起,但泛型在编译时(较早)解析,not在链接时。
理论上,C++标准定义了一个关键字,export
,来处理这些情况。在实践中,no编译器实现了这一点(有一个例外?),并且无意改变这一点,因为成本/实用性权衡被认为不够好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)