MDchong 2023-09-14 00:11 采纳率: 0%
浏览 5

C++ lnk2017这个错误是因为什么?

找了好久没找到具体什么原因,大家看看一下错误到底在哪,错误提示和代码如下:

img


#include<iostream>
#include<vector>
#include<fstream>
 
using namespace std;
 
template <typename elemType>
class Matrix
{
    friend Matrix<elemType>
        operator+(const Matrix<elemType>&, const Matrix<elemType>&);
 
    friend Matrix<elemType>
        operator*(const Matrix<elemType>&, const Matrix<elemType>&);
 
public:
    Matrix(int rows, int columns);
    Matrix(const Matrix&);
    ~Matrix();
    Matrix& operator+(const Matrix&);
 
    void operator+=(const Matrix&);
    elemType& operator()(int row, int column)
    {
        return _matrix[row*cols() + column];
    }
 
    const elemType& operator()(int row,int column)const
    {
        return _matrix[row*cols() + column];
    }
 
    int rows()const { return _rows; }
    int cols() const { return _cols; }
 
    bool same_size(const Matrix &m) const 
    {
        return rows == m.rows() && cols == m.cols();
    }
 
    bool comfortable(const Matrix &m)const { return (cols() == m.rows()); }
    ostream& print(ostream&)const;
 
protected:
    int _rows;
    int _cols;
    elemType *_matrix;
};
template <typename elemType>
inline ostream&
operator<<(ostream& os,const Matrix<elemType> &m)
{
    return m.print(os);
}
 
//Matrix.h文件结束
 
 
//深度拷贝 deep copy 
template <typename elemType>
Matrix<elemType>::Matrix(const Matrix &rhs)
{
    _rows = rhs._rows; _cols = rhs._cols;
    int mat_size = _rows * _cols;
    _matrix = new elemType[mat_size];
    for (int ix = 0; ix < mat_size; ++ix)
        _matrix[ix] = rhs._matrix[ix];
}
 
template <typename elemType>
Matrix<elemType>& Matrix<elemType>::operator+(const Matrix &rhs)
{
    if (this != &rhs) {
        _rows = rhs._rows; _cols = rhs._cols;
        int mat_size = _rows*_cols;
        delete[] _matrix;
        _matrix = new elemType[mat_size];
        for (int ix = 0; ix < mat_size; ++ix) {
            _matrix[ix] = rhs._matrix[ix];
        }
    }
    return *this;
}
 
template<typename elemType>
Matrix<elemType>
operator+(const Matrix<elemType> &m1, const Matrix<elemType> &m2)
{
    //确定m1和m2大小相同
    Matrix<elemType> result(m1);
    result += m2;
    return result;
}
 
template <typename elemType>
Matrix<elemType>
operator*(const Matrix<elemType> &m1, const Matrix<elemType> &m2) {
    //确定m1的行数(row)等于m2的列数(cloumn)
    Matrix<elemType> result(m1.rows(), m2.cols());
    for (int ix = 0; ix < m1.rows(); ix++) {
        for (int jx = 0; jx < m2.cols(); jx++)
        {
            result(ix, jx) = 0;
            for (int kx = 0; kx < m1.cols(); kx++)
                result(ix, jx) += m1(ix, kx)*m2(kx, jx);
        }
    }
    return result;
}
 
template <typename elemType>
void Matrix<elemType>::operator+=(const Matrix &m) {
    //确定m1和m2大小相同
    int matrix_size = cols()*rows();
    for (int ix = 0; ix < matrix_size; ++ix) {
        (*(_matrix + ix)) += (*(m._matrix + ix));
    }
}
 
template <typename elemType>
ostream& Matrix<elemType>::print(ostream &os)const {
    int col = cols();
    int matrix_size = col*rows();
    for (int ix = 0; ix < matrix_size; ++ix) {
        if (ix%col == 0)os << endl;
        os << (*(_matrix + ix)) << ' ';
    }
    os << endl;
    return os;
}
 
int main() 
{
    ofstream log("log.txt");
    if (!log) { cerr << "can't open log file!\n"; return 0; }
 
    Matrix<float> identity(4, 4);
    log << "identity: " << identity << endl;
    float ar[16] = { 1., 0., 0., 0., 0., 1., 0., 0.,
    0., 0., 1., 0., 0., 0., 0., 1. };
 
    for (int i = 0, k = 0; i < 4; ++i)
        for (int j = 0; j < 4; ++j)
            identity(i, j) = ar[k++];
    log << " identity after set: " << identity << endl;
 
    Matrix<float> m(identity);
    log << "m: memberwise initialized: " << m << endl;
 
    Matrix<float> m2(8, 12);
    log << "m2: 8x12: " << m2 <<endl;
 
    m2 = m;
    log << "m2 after memberwise assigned to m: " << m2 << endl;
 
    float ar2[16] = { 1.3, 0.4, 2.6, 8.2, 6.2, 1.7, 1.3, 8.3,
    4.2, 7.4, 2.7, 1.9, 6.3, 8.1, 5.6, 6.6 };
 
    Matrix<float> m3(4, 4);
    for (int ix = 0, kx = 0; ix < 4; ++ix)
        for (int j = 0; j < 4; ++j)
            m3(ix, j) = ar2[kx++];
 
    log << "m3:assigned random values: " << m3 << endl;
    Matrix<float> m4 = m3*identity; log << m4 << endl;
    Matrix<float> m5 = m3 + m4; log << m5 << endl;
 
    m3 += m4; log << m3 << endl;
    return 0;
}


```

  • 写回答

2条回答 默认 最新

  • 浪客 2023-09-14 00:22
    关注

    18-20行3个函数有声明,没定义。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月14日

悬赏问题

  • ¥15 pycharm添加远程解释器报错
  • ¥15 如何让子窗口鼠标滚动独立,不要传递消息给主窗口
  • ¥15 如何能达到用ping0.cc检测成这样?如图
  • ¥15 关于#DMA固件#的问题,请各位专家解答!
  • ¥15 matlab生成的x1图不趋于稳定,之后的图像是稳定的水平线
  • ¥15 请问华为OD岗位的内部职业发展通道都有哪些,以及各个级别晋升的要求
  • ¥20 微信小程序 canvas 问题
  • ¥15 系统 24h2 专业工作站版,浏览文件夹的图库,视频,图片之类的怎样删除?
  • ¥15 怎么把512还原为520格式
  • ¥15 MATLAB的动态模态分解出现错误,以CFX非定常模拟结果为快照