调用 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;
}
重要更新: 删除朋友的委托解决了问题部分 但是为什么呢?以及我怎样才能保持它为朋友...
为什么以下代码会导致链接器错误?
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_64clang: 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;
}