调用 operator<< 时出现链接器错误,如何解决?

Linker Error when calling operator<<, how to fix this?

重要更新: 删除朋友的委托解决了问题部分 但是为什么呢?以及我怎样才能保持它为朋友...

为什么以下代码会导致链接器错误?

Dimensions dims2(3 ,14);//Fixed class 100% the bug isn't cause by it
Matrix<int> mat_2(dims2, 5);
std::cout << mat_2;

我的class:

template<class T>
class Matrix {
public:
    friend std::ostream &operator<<(std::ostream &os, const Matrix<T> &matrix);

;}

.h 文件中我有:

template<typename T>
std::ostream &operator<<(std::ostream &os, const Matrix<T> &matrix) {}

我得到以下信息:

Undefined symbols for architecture x86_64:
"mtm::operator<<(std::__1::basic_ostream >&, mtm::Matrix const&)", referenced from: _main in main.cpp.o ld: symbol(s) not found for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation)

friend std::ostream &operator<<(std::ostream &os, const Matrix<T> &matrix);

这声明了一个名为 operator<< 的非模板函数(在包含 Matrix 定义的命名空间中)。该功能从未被定义。此外,还定义了一个名为operator<< 的函数模板。在进行重载解析时,编译器优先选择非模板而不是模板,然后链接器发现没有定义。

有几种方法可以解决这个问题。一种是在-class:

中定义运算符
template<class T>
class Matrix {
    friend std::ostream& operator<<(std::ostream& os, const Matrix<T>& matrix) {
      // Implementation here
    }
};

还有一个是加好友函数模板:

template <typename T> class Matrix;

template<typename T>
std::ostream &operator<<(std::ostream &os, const Matrix<T> &matrix);

template<class T>
class Matrix {
    friend std::ostream& operator<< <T>(std::ostream &os, const Matrix<T> &matrix);
};

第三是完全不需要友谊,例如像这样:

template<class T>
class Matrix {
public:
    // Actual implementation here.
    void PrintMe(std::ostream &os);
};

template<typename T>
std::ostream &operator<<(std::ostream &os, const Matrix<T> &matrix) {
  matrix.PrintMe(os);
  return os;
}