C ++“没有匹配的函数调用”错误

时间:2018-09-12 19:08:31

标签: c++ compiler-errors

因此,我有一个richMatrix模板类,该类对矩阵执行一些基本操作。但是,尝试调用main.cpp中的函数时出现错误。我不断得到:参数1从'richMatrix *'到'int **'的未知转换。

确切的错误消息如下:

    C:/Users/annan/Desktop/prog/main.cpp: In function 'int main()':

    C:/Users/annan/Desktop/prog/main.cpp:19:36: error: no matching function for call to 'richMatrix<int>::multiplyMatrix(richMatrix<int>*&, richMatrix<int>*&, int&)'
        eh->multiplyMatrix(meme, lol, s);


    In file included from C:/Users/annan/Desktop/prog/main.cpp:2:0:
    C:/Users/annan/Desktop/prog/richMatrix.cpp:21:5: note: candidate: T** richMatrix<T>::multiplyMatrix(T**, T**, int) [with T = int]
    T** richMatrix<T>::multiplyMatrix(T** mat1, T** mat2, int size) 

    C:/Users/annan/Desktop/prog/richMatrix.cpp:21:5: note:   no known conversion for argument 1 from 'richMatrix<int>*' to 'int**'
    mingw32-make.exe: *** [Debug/main.cpp.o] Error 1
    prog.mk:105: recipe for target 'Debug/main.cpp.o' failed
    ====1 errors, 23 warnings====

关于我的main.cpp,我不确定如何从richMatrix类中调用函数,因此我的main可能意义不大。我还是编码新手。据我所知,我的createNewMatrix函数可以正常工作,但是我对乘法和除法函数的调用却出错了。

据我了解,模板应该自动将其模板类型转换为已传递的变量类型,例如int,char,string等。

如果您能启发我有关我做错了什么,并且如果可能的话,请给我一些指示,以避免将来出现这种情况,我将不胜感激。

先谢谢了。

main.cpp

    #include "richMatrix.h"
    #include "richMatrix.cpp"
    #include <cstdlib>
    #include <string>
    #include <iostream>

    using namespace std;

    int main() {
        int s = 5;
        richMatrix<int> *meme;
        richMatrix<int> *lol;
        richMatrix<int> *eh;
        meme->createNewMatrix(s);
        lol->createNewMatrix(s);
        eh->createNewMatrix(s);
        eh->multiplyMatrix(meme, lol, s);
        eh->divideMatrix(meme, lol, s);

    };

richMatrix.h

    #ifndef RICHMATRIX_H
    #define RICHMATRIX_H
    #include <cstdlib>
    #include <string>
    #include <iostream>

    using namespace std;

    template <class T> class richMatrix {
        public:
            T** createNewMatrix(int size);
            T** multiplyMatrix(T** mat1, T** mat2, int size);
            T** divideMatrix(T** mat1,T** mat2, int size);
    };

    #endif

richMatrix.cpp

    #include "richMatrix.h"
    #include <cstdlib>
    #include <string>
    #include <iostream>

    using namespace std;

    template <class T>
    T** richMatrix<T>::createNewMatrix(int size) {
        T** matrix;
        int s;
        s = size;
        matrix = new T*[s];
        for(int i = 0; i < s; i++) {
            matrix[i] = new T[s];
        }
        return matrix;
    }

    template <class T>
    T** richMatrix<T>::multiplyMatrix(T** mat1, T** mat2, int size) {
        int s = size;
        T** newMatrix;
        newMatrix = new T*[s];
        for(int a = 0; a < s; a++) {
            newMatrix[a] = new T[s];
        }

        for(int i = 0; i < s; i++) {
            for(int j = 0; j < s; j++) {
                newMatrix[i][j] = mat1[i][j] * mat2[i][j];
            }
        }
        return newMatrix;
    }

    template <class T>
    T** richMatrix<T>::divideMatrix(T** mat1,T** mat2, int size) {
        int s = size;
        T** newMatrix;
        newMatrix = new T*[s];
        for(int a = 0; a < s; a++) {
            newMatrix[a] = new T[s];
        }

        for(int i = 0; i < s; i++) {
            for(int j = 0; j < s; j++) {
                newMatrix[i][j] = mat1[i][j] / mat2[i][j];
            }
        }
        return newMatrix;
    }

2 个答案:

答案 0 :(得分:0)

我相信您的问题在于函数的类型声明和/或传递给函数的内容。

对于下面的multipleMatrix函数,参数的类型为T **,在主函数中创建时为int **。

template <class T> class richMatrix {
    public:
        T** createNewMatrix(int size);
        T** multiplyMatrix(T** mat1, T** mat2, int size);
        T** divideMatrix(T** mat1,T** mat2, int size);
};

但是在main.cc中,您正在传递函数,您正在传递richMatrix *而不是int **

int main() {
    int s = 5;
    richMatrix<int> *meme;
    richMatrix<int> *lol;
    richMatrix<int> *eh;
    meme->createNewMatrix(s);
    lol->createNewMatrix(s);
    eh->createNewMatrix(s);
    eh->multiplyMatrix(meme, lol, s);//right here
    eh->divideMatrix(meme, lol, s);

};

您应该将传入multipleMatrix函数的对象更改为T **或更改该函数接受的参数以采用richMatrix *

答案 1 :(得分:0)

使用richMatrix<int> *meme;时,您的multiplyMatrix()函数变为:

int** multiplyMatrix(int** mat1,int** mat2, int size);

您会看到mat1mat2类型是richMatrix<int> *,而不是您在函数声明中期望的int **类型。

和矩阵应通过以下方式创建:

auto meme = new richMatrix<int>();
//or in C++14 this way:
auto meme = std::make_unique<richMatrix<int>>();

因为richMatrix<int> *meme;仅声明一个没有分配的指针,所以在成功编译后首先调用

meme->createNewMatrix(s);

将导致崩溃。