gpt4 book ai didi

c++ - C++ 中的 friend 和模板

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:33:23 25 4
gpt4 key购买 nike

我的 C++ 代码示例中有一个大问题。 “ friend ”和"template"有问题。

错误信息:
Matrix.h:26:79: 警告:

friend declaration 'std::ostream& matrixClass::operator<<(std::ostream&, const matrixClass::Matrix&)' declares a non-template function [-Wnon-template-friend] friend std::ostream &operator<<(std::ostream&, const Matrix &matrix);

Matrix.h:26:79: 注意:

  (if this is not what you intended, make sure the function template

has already been declared and add <> after the function name here)

Matrix.h:28:77: 警告:

  friend declaration 'matrixClass::Matrix<T>*

matrixClass::operator*(const matrixClass::Matrix&, const matrixClass::Matrix&)' declares a non-template function [-Wnon-template-friend] friend Matrix* operator*(const Matrix &m1, const Matrix &m2);

矩阵.cpp:1:0:

C:\Users\Peter\CLionProjects\PK\untitled76\Matrix.h:26:79: warning: friend declaration 'std::ostream& matrixClass::operator<<(std::ostream&, const matrixClass::Matrix&)' declares a non-template function [-Wnon-template-friend] friend std::ostream &operator<<(std::ostream&, const Matrix &matrix);

Matrix.h:26:79: 注意:

  (if this is not what you intended, make sure the function template

has already been declared and add <> after the function name here)

Matrix.h:28:77: 警告:

  friend declaration 'matrixClass::Matrix<T>*

matrixClass::operator*(const matrixClass::Matrix&, const matrixClass::Matrix&)' declares a non-template function [-Wnon-template-friend] friend Matrix* operator*(const Matrix &m1, const Matrix &m2);

CMakeFiles\untitled76.dir/objects.a(main.cpp.obj):在函数“main”中:

main.cpp:8: undefined reference main.cpp:8: 对 matrixClass::Matrix<int>::Matrix(int)'<br>
main.cpp:10: undefined reference to
的 undefined reference matrixClass::Matrix::set(int, int, int)'
main.cpp:11: 对 matrixClass::Matrix<int>::set(int, int, int)'<br>
main.cpp:12: undefined reference to
的 undefined reference matrixClass::Matrix::set(int, int, int)'
main.cpp:13: 对 matrixClass::Matrix<int>::set(int, int, int)'<br>
main.cpp:15: undefined reference to
的 undefined reference matrixClass::operator<<(std::ostream&, matrixClass::Matrix const&)'
main.cpp:15: 未定义对 matrixClass::operator<<(std::ostream&, matrixClass::Matrix<int> const&)'<br>
main.cpp:8: undefined reference to
的引用矩阵类::矩阵::~矩阵()'
main.cpp:8: 未定义对`matrixClass::Matrix::~Matrix()'的引用

代码:矩阵.h

#ifndef MATRIX_H_
#define MATRIX_H_

#include <iostream>

namespace matrixClass {

template<class T>
class Matrix {
private:
int dimension;
T **m;
public:
Matrix(int d);

Matrix(const Matrix &original);

~Matrix();

void set(int x, int y, T value);

T get(int x, int y) const;

int getDimension() const;

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

friend Matrix<T>* operator*(const Matrix<T> &m1, const Matrix<T> &m2);
};
}

#endif

矩阵.cpp

#include "Matrix.h"

using namespace matrixClass;

template<class T>
Matrix<T>::Matrix(int d)
: dimension{d}, m{new T *[d]} {
//m = new T*[d];

for (int i = 0; i < d; i++) {
m[i] = new T[d];
}
}

// COPY-CONSTRUCTOR
template<class T>
Matrix<T>::Matrix(const Matrix &original)
: dimension{original.dimension},
m{new T *[original.dimension]} {
for (int i = 0; i < dimension; i++) {
*(m + i) = *(original.m + i);
}
}

// DESTRUCTOR
template<class T>
Matrix<T>::~Matrix() {
for (int i = 0; i < dimension; i++) {
delete[] m[i];
}
delete[] m;
}

template<class T>
void Matrix<T>::set(int x, int y, T value) {
m[x][y] = value;
}

template<class T>
T Matrix<T>::get(int x, int y) const {
return m[x][y];
}

template<class T>
int Matrix<T>::getDimension() const {
return dimension;
}

template<class T>
std::ostream& operator<<(std::ostream& output, const Matrix<T>& matrix) {
int dimension = matrix.getDimension();

for(int x = 0; x < dimension; x++) {
for(int y = 0; y < dimension; y++) {
output << matrix.get(x, y) << " ";
}
return output;
}
}

template<class T>
Matrix<T>* operator*(const Matrix<T>& m1, const Matrix<T>& m2) {
int dimension = m1.getDimension();
Matrix<T>* m = new Matrix<T>(dimension);

for(int x = 0; x < dimension; x++) {
for(int y = 0; y < dimension; y++) {
T value = 0;
for(int i = 0; i < dimension; i++) {
value += m1.get(x, i) * m2.get(i, y);
}
m->set(x, y, value);
}
}
return m;
}

main.cpp

#include <iostream>
#include "Matrix.h"

using namespace matrixClass;
using namespace std;

int main() {
Matrix<int> m(2);

m.set(0, 0, 1);
m.set(0, 1, 2);
m.set(1, 0, 3);
m.set(1, 1, 4);

cout << m << "*" << endl << m << "=" << endl;

return 0;
}

最佳答案

friend声明operator<<引用一个非模板函数,而它的定义说它是一个模板函数;他们不匹配。

您可以使用 friend 内联定义它声明(作为非模板函数):

template<class T>
class Matrix {
... ...
friend std::ostream& operator<<(std::ostream& output, const Matrix<T>& matrix) {
int dimension = matrix.getDimension();

for(int x = 0; x < dimension; x++) {
for(int y = 0; y < dimension; y++) {
output << matrix.get(x, y) << " ";
}
return output;
}
}
... ...
};

或者制作friend引用函数模板的声明:

// class declaration
template<class T>
class Matrix;

// function declaration
template<class T>
std::ostream& operator<<(std::ostream& output, const Matrix<T>& matrix);

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

// function definition
template<class T>
std::ostream& operator<<(std::ostream& output, const Matrix<T>& matrix) {
int dimension = matrix.getDimension();

for(int x = 0; x < dimension; x++) {
for(int y = 0; y < dimension; y++) {
output << matrix.get(x, y) << " ";
}
return output;
}
}

关于 undefined reference 错误,参见Why can templates only be implemented in the header file?

关于c++ - C++ 中的 friend 和模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48626437/

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