C ++错误代码C2784无法推断出模板参数

时间:2016-04-06 13:35:33

标签: c++ c++11 matrix

我是面向对象编程和C ++的新手。我一直在研究矩阵类和squarematrix类,并且遇到了一些我似乎无法弄清楚的问题。我得到的错误代码是:

C2784:
'matrix<T,m,k> operator *(matrix<T,m,n> &,matrix<T,n,k> &)': could not 
deduce template argument for 'matrix<T,m,n> &' from 
'std::vector<std::vector<double,std::allocator<_Ty>>,std::allocator<std::vector<_Ty,std::allocator<_Ty>>>>'

我真的不确定为什么,因为我的代码的其他部分工作。该错误报告在“product.elements = product.elements * elements;”

的行中
//Source.cpp
#include"Squarematrix.h"
#include<iostream>
#include<vector>
using namespace std;
int main() {
    vector<double> a = { 1, 2,4,5,6};
    squarematrix<double,2> N;
    N.assign(a);
    cout << N << N.pow(2)<< endl;
    return(0);
}

//Matrix.h
#ifndef _Matrix_
#define _Matrix_
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
template<class T, int m, int n>
class matrix {
public:
    vector<vector<T>> elements;
    int nrow;
    int ncol;
    matrix();
    matrix(matrix<T, m, n>&);
 };
template<class T, int m, int n>
matrix<T, m, n>::matrix() {
    vector<T>temp(n, 0);
    elements.assign(m, temp);
    nrow = m;  //m=0
    ncol = n;  //n=0
}
template<class T, int m, int n>
matrix<T, m, n>::matrix(matrix<T, m, n>& a) {
    elements = a.elements;
    nrow = m;
    ncol = n;
}
template<class T, int m, int n, int k>
matrix<T, m, k> operator*(const matrix<T, m, n>& a, const matrix<T, n, k>& b) {
matrix<T, m, k> product;
for (int i = 0; i < m; i++) {
    for (int j = 0; j < k; j++) {
        for (int h = 0; h < n; h++)
            product.elements[i][j] += a.elements[i][h] * b.elements[h][j];
    }
}
return product;
}

template<class T, int m, int n>
ostream& operator<< (ostream& o, const matrix<T, m, n>& input) {
    for (int i = 0; i < m; ++i) {
    for (int j = 0; j < n; ++j)
    o << input.elements[i][j] << " ";
    o << endl;
    }
    return o;
}
#endif _Matrix_

//Squarematrix.h
#ifndef _Squarematrix_
#define _Squarematrix_

#include "Matrix.h"
#include <iostream>
#include <vector>
using namespace std;

template<class T, int n>
class squarematrix : public matrix<T, n, n> {
public:
    squarematrix();
    squarematrix(squarematrix<T, n>&);

    squarematrix<T, n> pow(int); //calculate A^k
}; 
template<class T, int n>
squarematrix<T, n>::squarematrix(){
    vector<T>temp(n, 0);
    elements.assign(n, temp);
    nrow = n;  //n=0
    ncol = n;  //n=0
}
template<class T, int n>
squarematrix<T, n>::squarematrix(squarematrix<T, n>& a){
    elements = a.elements;
    nrow = n;
    ncol = n;
}
template<class T, int n>
squarematrix<T, n> squarematrix<T, n>::pow(int k){
    squarematrix<T, n> product;
    product.elements = elements;
    for (int power = 2; power <= k; power++) {
    product.elements = product.elements * elements;  
    }
    return product;
}
#endif _Squarematrix_

2 个答案:

答案 0 :(得分:1)

您不需要nrowncol - 它们是模板参数,在编译时已知。

但这不是问题 - 你将std::vector乘以应该乘以squarematrix的位置:

template<class T, int n>
squarematrix<T, n> squarematrix<T, n>::pow(int k){
    squarematrix<T, n> product = unit_matrix<T, n>();
    for (int power = 1; power <= k; power++) {
        product = product * *this;
    }
    return product;
}

我使用了一个创建单位矩阵的虚构函数 将该功能写成练习。

答案 1 :(得分:1)

此代码product.elements = product.elements * elements表示您希望使用两个std::vector进行相乘,但您不支持使用两个类型为operator *的参数的std::vector操作。 在您的代码中,您支持使用类型矩阵的operator *操作,因此如果您想使用它,则应将代码product.elements = product.elements * elements更改为product.elements = (product * *this).elements

没关系。 所以类Squarematrix的成员函数pow的代码是:

template<class T, int n>
squarematrix<T, n> squarematrix<T, n>::pow(int k){
    squarematrix<T, n> product;
    product.elements = this->elements;
    for (int power = 2; power <= k; power++) {
        product.elements = (product * *this).elements;
    }       
    return product;
}           

最后,#endif是一些预定义的结束,不遵循一些宏,否则,编译器会抛出一些警告或错误。