Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++_Templates_Linker_Operator Overloading - Fatal编程技术网

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){}