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

The*_*own 1 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) {
   ...  
}
Run Code Online (Sandbox Code Playgroud)

我可以将这个编译成一个没有问题的对象,但是当其他函数试图调用它时,会出现这个错误(每次使用<<时).

myclass.cpp: undefined reference to `MyClass& MyClass::operator<< <int>(int const&)'
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Dou*_* T. 8

如果要在单独的编译单元中定义模板的实例(通常是这种情况),则无法在单独的cpp中定义模板方法.编译使用该模板类的编译单元时,编译器必须可以看到每个模板方法.因此,在跨cpps使用模板时,必须在标头中定义模板.模板实际上是生成类而不是自己的类的方法.因此,当编译器看到

YourClass<int>
Run Code Online (Sandbox Code Playgroud)

它需要在编译时看到整个YourClass模板以生成一个名为的类型

YourClass<int>
Run Code Online (Sandbox Code Playgroud)

和它的所有方法,它们完全不同

YourClass<float>
Run Code Online (Sandbox Code Playgroud)

这意味着它必须看到所有的C++源代码.如果模板的这两种用法在单独的cpp中实例化,那么编译器只能生成两者的唯一方法是在一个头中完全定义模板.

见我的答案在这里获得更多信息.

感谢有用的评论,大大改善了这个答案