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)
我究竟做错了什么?
如果要在单独的编译单元中定义模板的实例(通常是这种情况),则无法在单独的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中实例化,那么编译器只能生成两者的唯一方法是在一个头中完全定义模板.
见我的答案在这里获得更多信息.
感谢有用的评论,大大改善了这个答案