簡體   English   中英

C ++錯誤代碼C2784無法推斷出模板參數

[英]C++ Error Code C2784 could not deduce template argument for

我對面向對象的編程和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 *元素;”行中報告。

//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_

你不需要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;
}

我使用了一個虛構的函數來創建單位矩陣。
編寫該功能作為練習。

這段代碼product.elements = product.elements * elements表示要使用兩個std::vector進行乘法運算,但是您不支持對兩個類型為std::vector參數進行operator *操作。 在您的代碼中,您支持使用類型矩陣的operator *操作,因此,如果要使用它,則應將代碼product.elements = product.elements * elements更改為product.elements = (product * *this).elements

沒關系。 因此, Squarematrix類的成員函數pow的Squarematrix為:

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是一些預定義的結尾,並且不要遵循某些宏,否則,編譯器將引發一些警告或錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM