gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:14:37 26 4
gpt4 key购买 nike

重要更新:删除 friend 的代表团部分解决了问题,但为什么呢?我怎样才能把它当作 friend ...

为什么下面的代码让我出现链接器错误?

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

我的课:
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<<被定义为。在进行重载解析时,编译器更喜欢非模板而不是模板,然后链接器发现没有定义。

有几种方法可以解决这个问题。一种是在类中定义运算符:
template<class T>
class Matrix {
friend std::ostream& operator<<(std::ostream& os, const Matrix<T>& matrix) {
// Implementation here
}
};

另一个是与函数模板交 friend :
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;
}

关于c++ - 调用 operator<< 时出现链接器错误,如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62367230/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com