Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;重载运算符声明和定义问题_C++_Declaration_Definition - Fatal编程技术网

C++ C++;重载运算符声明和定义问题

C++ C++;重载运算符声明和定义问题,c++,declaration,definition,C++,Declaration,Definition,我很难让它发挥作用 file: myclass.hpp Class MyClass { public: template <class T> MyClass &operator<<(const T &val); }; file: myclass.cpp template <class T> MyClass &MyClass::operator<<(const T &val) { ...

我很难让它发挥作用

file: myclass.hpp

Class MyClass {
public:
  template <class T>    
  MyClass &operator<<(const T &val);
};


file: myclass.cpp

template <class T>
MyClass &MyClass::operator<<(const T &val) {
   ...  
}
文件:myclass.hpp
类MyClass{
公众:
模板

MyClass&operator将运算符的定义放在
.hpp
中,而不是放在
.cpp
中。编译器需要能够在为某些新类型实例化模板时看到该模板的完整定义,以便为该专门化生成代码


还有一些关于此类与模板相关的链接器错误的问题和答案以及中不同的可能解决方案。

将运算符的定义放在
.hpp
中,而不是放在
.cpp
中。编译器需要能够在某些时间内实例化模板时查看其完整定义新类型,以便它可以生成此专门化的代码


如果要在单独的编译单元中定义模板的实例(通常情况下),则在中还有一些关于此类与模板相关的链接器错误和不同可能的解决方案的问题和答案。

然后,您不能在单独的cpp中定义模板方法。在编译使用该模板类的编译单元时,编译器必须可以看到每个模板方法。因此,在跨cpp使用模板时,必须在标头中定义模板。模板实际上是生成类的方法,而不是类本身。t因此,当编译器看到

YourClass<int>
YourClass
它需要在编译时查看整个YourClass模板,以生成一个名为

YourClass<int>
YourClass
以及它的所有方法,这些方法与say完全不同

YourClass<float>
YourClass

这意味着它必须看到所有C++源代码。如果模板的这两个用法在单独的CPP中被实例化,那么编译器只能生成两个方法的唯一方法就是在一个报头中完全定义模板。 更多信息请参见我的答案


如果您想在单独的编译单元中定义模板的实例(通常情况下),感谢您的有用评论,这些评论大大改进了此答案然后,您不能在单独的cpp中定义模板方法。在编译使用该模板类的编译单元时,编译器必须可以看到每个模板方法。因此,在跨cpp使用模板时,必须在标头中定义模板。模板实际上是生成类的方法,而不是类本身。t因此,当编译器看到

YourClass<int>
YourClass
它需要在编译时查看整个YourClass模板,以生成一个名为

YourClass<int>
YourClass
以及它的所有方法,这些方法与say完全不同

YourClass<float>
YourClass

这意味着它必须看到所有C++源代码。如果模板的这两个用法在单独的CPP中被实例化,那么编译器只能生成两个方法的唯一方法就是在一个报头中完全定义模板。 更多信息请参见我的答案


感谢您的有用评论,这些评论大大改进了这个答案。模板需要在头文件中定义,而不是在cpp文件中。实际的实现是在使用时根据需要在每个编译单元中创建的。在这方面,它们有点像宏。

模板需要在头文件中定义er文件而不是cpp文件。实际的实现是在使用时根据需要在每个编译单元中创建的。在这方面,它们有点像宏。

+1,基本上是正确的,但事实上,只要手动实例化应用程序中使用的所有类型,就可以在.cpp文件中创建模板定义。T也就是说,在定义之后加上:“模板类YourClass;模板类YourClass;…”这是GNU黄金链接器使用的技术:并且。你的错误断言阻止了我对你的两个答案进行投票:(谢谢,我还没有完全意识到这一点。更新了我的答案。+1,基本上是正确的,但事实上你可以在.cpp文件中有你的模板定义,只要你手动实例化应用程序中使用的所有类型。也就是说,在定义之后添加:'template class YourClass;template class YourClass;…'或者GNU黄金链接器:还有。你的这个错误断言阻止了我对你的两个答案进行投票:(谢谢,我还没有完全意识到。更新了我的答案。)。