模板矩阵标量乘法c ++

时间:2016-04-01 20:01:36

标签: c++

当我尝试编译以下编码时,我收到错误

错误1错误LNK2019:未解析的外部符号&#34;类Matrix __cdecl运算符*(int const&amp;,类Matrix&amp;)&#34; (?? D @ YA?AV?$ Matrix @ H $ 02 $ 01 @@ ABHAAV0 @@ Z)在函数_main C:\ Users \ pc \ Documents \ Visual Studio 2013 \ Projects \ Homework4 \ Homework4 \ main.obj中引用Homework4 < /强>

此错误是由矩阵上的标量乘法产生的,我不知道如何修复它。有人可以给我一个建议吗?

//Matrix.h
#pragma once
#include <iostream>
#include <vector>
using namespace std;

template<class T, int m, int n>
class Matrix
{
vector<vector<T>> elements;
int nrow;
int ncol;

public:
Matrix();
~Matrix();
void print();
vector<T> row(int);
vector<T> col(int);

friend Matrix<T, m, n> operator+<>(const Matrix<T, m, n>&, const Matrix<T, m, n>&);
friend Matrix<T, m, n> operator-<>(const Matrix<T, m, n>&, const Matrix<T, m, n>&);
friend Matrix<T, m, n> operator*(const T&, Matrix<T, m, n>&);

};

template<class T, int m, int n>
Matrix<T, m, n>::Matrix() : nrow(m), ncol(n)
{
for (int i = 0; i < nrow; i++){
    vector<T> row(ncol, i);
    elements.push_back(row);
}
}

template<class T,int m,int n>
vector<T> Matrix<T, m, n>::row(int i)
{
return elements[i];
}

template<class T, int m, int n>
vector<T> Matrix<T, m, n>::col(int j)
{
vector<T> col;
for (int i = 0; i < ncol; i++)
{
    col.push_back(elements[i][j]);
}
return col;
}

template<class T, int m, int n>
Matrix<T, m, n>::~Matrix(){}

template<class T, int m, int n>
void Matrix<T, m, n>::print()
{
for (int i = 0; i < nrow; i++){
    for (int j = 0; j < ncol; j++)
    {
        cout << elements[i][j] << " ";
    }
    cout << endl;
}
}

template<class T, int m, int n>
Matrix<T, m, n> operator+(const Matrix<T, m, n>& m1, const Matrix<T, m, n>& m2){
Matrix<T, m, n> m3;
int nrow = m1.nrow;
int ncol = m1.ncol;
for (int i = 0; i < nrow; ++i){
    for (int j = 0; j < ncol; ++j){
        m3.elements[i][j] = m1.elements[i][j] + m2.elements[i][j];
    }
}

return m3;
}

template<class T, int m, int n>
Matrix<T, m, n> operator-(const Matrix<T, m, n>& m1, const Matrix<T, m, n>& m2){
Matrix<T, m, n> m3;
int nrow = m1.nrow;
int ncol = m1.ncol;
for (int i = 0; i < nrow; ++i){
    for (int j = 0; j < ncol; ++j){
        m3.elements[i][j] = m1.elements[i][j] - m2.elements[i][j];
    }
}

return m3;
}


template<class T, int m, int n>
Matrix<T, m, n> operator*(const T& c, const Matrix<T, m, n>& m1){
int nrow = m1.nrow;
int ncol = m1.ncol;
Matrix<T, m, n> m2;
for (int i = 0; i < nrow; ++i){
    for (int j = 0; j < ncol; ++j){
        m2.elements[i][j] = c*m1.elements[i][j];
    }
}
return m2;
}

//main.cpp
#include "Matrix.h"
using namespace std;

int main()
{
Matrix<int, 3, 2> a;
Matrix<int, 3, 2> b;
Matrix<int, 3, 2> c;
c = 2*b;

c.print();  
}

我认为错误来自班级正文中的朋友功能(操作*),但我不知道如何修复它......

1 个答案:

答案 0 :(得分:1)

发生错误是因为 a)operator*被声明为非模板(您应该使用<>) b)如果使用<>语法,则必须提供模板声明。

修复 (在Matrix类之前添加):

template<class T, int m, int n>
class Matrix;

template<class T, int m, int n>
Matrix<T, m, n> operator*(T&, const Matrix<T, m, n>&);

//class matrix definition here

<>添加到operator* friend声明:

friend Matrix<T, m, n> operator*<>(T&, const Matrix<T, m, n>&);