Pet*_*ich 6 c++ templates friend shadow operator-keyword
我的C++代码示例中存在一个大问题."朋友"和"模板"有问题.
错误消息:
Matrix.h:26:79:警告:
friend声明'std :: ostream&matrixClass :: operator <<(std :: ostream&,const matrixClass :: Matrix&)'声明一个非模板函数[-Wnon-template-friend] friend std :: ostream&operator <<(std :: ostream&,const Matrix&matrix);
Matrix.h:26:79:注意:
Run Code Online (Sandbox Code Playgroud)(if this is not what you intended, make sure the function template
已声明并在此处添加<>后的函数名称)
Matrix.h:28:77:警告:
Run Code Online (Sandbox Code Playgroud)friend declaration 'matrixClass::Matrix<T>*
matrixClass :: operator*(const matrixClass :: Matrix&,const matrixClass :: Matrix&)'声明一个非模板函数[-Wnon-template-friend]朋友Matrix*operator*(const Matrix&m1,const Matrix&m2);
Matrix.cpp:1:0:
C:\ Users\Peter\CLIONProjects\PK\untitled76\Matrix.h:26:79:警告:朋友声明'std :: ostream&matrixClass :: operator <<(std :: ostream&,const matrixClass :: Matrix&)'声明非模板函数[-Wnon-template-friend]朋友std :: ostream&operator <<(std :: ostream&,const Matrix&matrix);
Matrix.h:26:79:注意:
Run Code Online (Sandbox Code Playgroud)(if this is not what you intended, make sure the function template
已声明并在此处添加<>后的函数名称)
Matrix.h:28:77:警告:
Run Code Online (Sandbox Code Playgroud)friend declaration 'matrixClass::Matrix<T>*
matrixClass :: operator*(const matrixClass :: Matrix&,const matrixClass :: Matrix&)'声明一个非模板函数[-Wnon-template-friend]朋友Matrix*operator*(const Matrix&m1,const Matrix&m2);
CMakeFiles\untitled76.dir/objects.a(main.cpp.obj):在函数`main'中:
main.cpp:8:对main.cpp的未定义引用:8:对matrixClass::Matrix<int>::Matrix(int)'<br>
main.cpp:10: undefined reference to
matrixClass的未定义引用:: Matrix :: set(int,int,int)'
main.cpp:11:对matrixClass::Matrix<int>::set(int, int, int)'<br>
main.cpp:12: undefined reference to
matrixClass :: Matrix :: set的未定义引用( int,int,int)'
main.cpp:13:对matrixClass::Matrix<int>::set(int, int, int)'<br>
main.cpp:15: undefined reference to
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
matrixClass :: Matrix ::的未定义引用~Matrix()'
main.cpp:8:未定义引用`matrixClass :: Matrix :: ~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
Run Code Online (Sandbox Code Playgroud)
Matrix.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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
在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;
}
}
... ...
};
Run Code Online (Sandbox Code Playgroud)
或者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;
}
}
Run Code Online (Sandbox Code Playgroud)
关于未定义的引用错误,请参阅为什么模板只能在头文件中实现?
归档时间: |
|
查看次数: |
438 次 |
最近记录: |