我有一个类Vector<T>
,并且正在使用提供类的库 YAML::Node
.我想重载 operator>>
对于这两种类型。
我已将以下声明添加到 Vector
的声明:
friend void operator>>(YAML::Node const & node, Vector<T> & v);
我还添加了以下功能实现:
template<typename T>
void operator>>(YAML::Node const & node, Vector<T> & v) {
node[0] >> v.x;
node[1] >> v.y;
node[2] >> v.z;
}
最后,我添加了以下(尝试)显式实例化 T = num_t
的模板:
template
void operator>>(YAML::Node const & node, Vector<num_t> & v);
但是,这会导致以下链接器错误:
Error 9 error LNK2019: unresolved external symbol "void __cdecl operator>>(class YAML::Node const &,class Vector<double> &)" (??5@YAXAEBVNode@YAML@@AEAV?$Vector@N@@@Z) referenced in function "public: static class Scene __cdecl Scene::fromFile(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?fromFile@Scene@@SA?AV1@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
( num_t
是 double
的类型定义)
但是,如果我添加函数的以下(非模板)实现,一切都可以正常编译:
void operator>>(YAML::Node const & node, Vector<num_t> & v) {
node[0] >> v.x;
node[1] >> v.y;
node[2] >> v.z;
}
为什么函数的模板版本不起作用?
编辑:忘了说;编译器是 Visual Studio 11 Beta
最佳答案
将函数声明为 friend
不声明函数模板;相反,类模板的每个特化都声明了一个非模板函数,其参数类型根据模板参数重载。这些将被选择而不是您定义的模板;但它们未定义,因此出现错误。
要修复它,您可以在类模板之前声明函数模板(在这种情况下,友元声明将使它成为一个友元,而不是声明一个新函数),或者在类模板中内联定义友元函数, 这样类模板的每个特化都定义了函数并声明了它。
关于c++ - operator>> 重载的显式实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9611588/