这是我的代码:
mov.h
#include <iostream>
template< class T>
class Movie {
public:
Movie(T in) {
a = in;
}
friend std::ostream& operator<<(std::ostream& os, const Movie<T>& movie);
private:
T a;
};
template<class T>
std::ostream& operator<<(std::ostream& os, const Movie<T>& movie) {
return os;
}
main.cpp
#include "mov.h"
int main() {
Movie<int> movie1(1);
std::cout << movie1 << std::endl;
return 0;
}
我尝试编译此代码,但出现错误:
Error 1 error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Movie<int> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$Movie@H@@@Z) referenced in function _main c:\Users\Adi\documents\visual studio 2013\Projects\bdika01\bdika01\main.obj bdika01
Error 2 error LNK1120: 1 unresolved externals c:\users\adi\documents\visual studio 2013\Projects\bdika01\Debug\bdika01.exe 1 1 bdika01
如果我这样尝试内联代码,那就可以了:
mov.h
#include <iostream>
template<class T>
class Movie {
public:
Movie(T in) {
a = in;
}
friend std::ostream& operator<<(std::ostream& os, const Movie<T>& movie){
return os;
}
private:
T a;
};
如果我想分开定义和声明该怎么办?
谢谢。
最佳答案
template <typename T> class Movie;
template<class T>
std::ostream& operator<<(std::ostream& os, const Movie<T>& movie);
template< class T>
class Movie {
friend std::ostream& operator<< <T>(std::ostream& os, const Movie<T>& movie);
};
template<class T>
std::ostream& operator<<(std::ostream& os, const Movie<T>& movie){
return os;
}
在您的原始代码中,您与一个非模板函数成为 friend ,该函数恰巧以
Movie<>
的正确实例为参数。因此,每次实例化Movie<T>
时,都会在封闭的 namespace 范围中声明(但未定义)相应的非模板operator<<
。 friend
声明很奇怪。另外,您声明并定义了一个名为
operator<<
的功能模板(它不是Movie
的任何实例的 friend )。但是,在其他条件相同的情况下,重载解析更喜欢非模板。关于c++ - 运算符<< friend 功能和模板,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25297420/