C++ 过载<&书信电报;模板类中的运算符为我提供链接器错误(C+;+;)
在您询问之前,是的,该函数在我的模板类的标题中定义 下面是C++ 过载<&书信电报;模板类中的运算符为我提供链接器错误(C+;+;),c++,templates,linker,operator-overloading,C++,Templates,Linker,Operator Overloading,在您询问之前,是的,该函数在我的模板类的标题中定义 下面是示例.h的相关位: template<class T, class J, const int X, const int Y> class Example { public: friend std::ostream& operator<<(std::ostream& s, const Example<T,J,X,Y>& b); } template<
示例.h的相关位:
template<class T, class J, const int X, const int Y>
class Example {
public:
friend std::ostream& operator<<(std::ostream& s, const Example<T,J,X,Y>& b);
}
template<class T, class J, const int X, const int Y>
std::ostream& operator<<(std::ostream& s, const Example<T,J,X,Y>& b) {
// stuff
}
编译时,我收到以下链接器错误:
Undefined symbols for architecture x86_64:
"operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, Example<A, B, 5, 5> const&)", referenced from:
foo(Example<A, B, 5, 5>&) in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [dist/Debug/GNU-MacOSX/consolehero] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
架构x86_64的未定义符号:
“操作员长话短说:
warning: friend declaration ‘std::ostream& operator<<
(std::ostream&, const Example<T, J, X, Y>&)’ declares a non-template function
或者,使用
template<class T, class J, const int X, const int Y>
class Example {
public:
template<class T1, class J1, const int X1, const int Y1>
friend std::ostream& operator<<(std::ostream& s,
const Example<T1,J1,X1,Y1>& b);
};
template<class T1, class J1, const int X1, const int Y1>
std::ostream& operator<<(std::ostream& s, const Example<T1,J1,X1,Y1>& b) {
// stuff
}
模板
课例{
公众:
模板
friend std::ostream&operatorMan,这东西令人困惑。我是通过删除类中的定义来实现的。然后我在定义中添加了inline
。它可以工作-但是如何工作?程序如何知道在调用@maxmackie时使用该函数找到了一些文档,请参阅更新的编辑或模板(friend operators)
template<class T, class J, const int X, const int Y>
class Example {
public:
friend std::ostream& operator<<(std::ostream& s, const Example& b)
{
// stuff here
}
};
template<class T, class J, const int X, const int Y>
class Example {
public:
template<class T1, class J1, const int X1, const int Y1>
friend std::ostream& operator<<(std::ostream& s,
const Example<T1,J1,X1,Y1>& b);
};
template<class T1, class J1, const int X1, const int Y1>
std::ostream& operator<<(std::ostream& s, const Example<T1,J1,X1,Y1>& b) {
// stuff
}
friend std::ostream& operator<<(std::ostream& s, const Example& b){}
friend std::ostream& operator<<(std::ostream& s, const Example<T,J,X,Y>& b){}