c++ - operator>> 重载的显式实例化

标签 c++ templates operator-overloading

我有一个类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_tdouble 的类型定义)

但是,如果我添加函数的以下(非模板)实现,一切都可以正常编译:

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/

相关文章:

c++ - 自制 vector 模板运算符[]错误

c++ - 当我尝试包含 OpenNI.h 时没有这样的文件或目录

c++ - 片段着色器中的纹理错误值

c++ - 使用重载赋值运算符

templates - 访问模板中包含空格的字段

c++ - 使用右值引用重载模板化可变参数运算符

c++ - 二叉树插入函数无法正常工作 C++

c++ - 将 C++ 程序的输出发送到变量 bash

c++ - 如何编写模板?

c++使用指向其他类的指针重载类的赋值运算符