错误:没有匹配的调用函数

Posted

技术标签:

【中文标题】错误:没有匹配的调用函数【英文标题】:error: no matching function for call to 【发布时间】:2012-03-13 10:47:48 【问题描述】:

这是我的错误...

"在构造函数'NumGame::NumGame(int&)'中: 错误:没有匹配函数调用'Category::Category()'"

我在这里查看了一些类似的问题,但似乎找不到答案。我有一个基类 Category 并且 NumGame 是从它继承的,但不会编译。

class Category 

public:
    void virtual selection(int&);
    Category(int&);
    virtual ~Category();
private:
    int myRandNum;
;

Category::Category(int& a)
    myRandNum = a;


void Category::selection(int& a)
    cout << "I am NumGame version number... " << a << endl;
    cout << "Now Im playing... " << myRandNum << endl;


class NumGame : public Category 

public:
    void selection(int&);
    NumGame(int&);
    ~NumGame();
private:
    int myRandNum;
;

NumGame::NumGame(int& b)
    myRandNum = b;


void NumGame::selection(int& b) 


【问题讨论】:

【参考方案1】:

错误原因:

当您创建派生类NumGame 基类Category 的实例时,不会调用任何参数构造函数来创建对象的Category 部分。你的类没有,编译器抱怨它。

为什么编译器没有合成默认构造函数?

一旦你为你的类提供了任何构造函数,编译器不会为你合成不带任何参数的构造函数,如果你的代码使用,你必须自己提供。

解决方案:

有两种方法可以避免错误:

通过Member Initializer list在基类Catoegory子对象中调用适当的可用构造函数。这消除了您的代码使用无参数构造函数的情况。

NumGame::NumGame(int& b) : Category(b)



您需要自己为Category 类提供无参数构造函数:

Category::Category()



【讨论】:

太棒了,唯一能帮助我解决这个问题的答案。 :D【参考方案2】:

Category 没有默认构造函数,所以在构造NumGameCategory 基对象时需要提供参数:

NumGame::NumGame(int& b) :
    Category(b)

    myRandNum = b;

【讨论】:

但是我不是只是过度使用默认构造函数吗?如果我不覆盖它,那么将使用默认构造函数,这就是为什么我在默认构造函数中有参数。顺便说一句,两个答案都导致我的代码编译,显然有些事情我不清楚:)【参考方案3】:

在您的NumGame 类中,您必须提供对基类构造函数的调用。如果您不这样做,编译器会使用默认构造函数为您执行此操作:在您的情况下 Category() 您没有..

【讨论】:

以上是关于错误:没有匹配的调用函数的主要内容,如果未能解决你的问题,请参考以下文章

错误:在 C++ 中没有用于调用构造函数的匹配函数

创建函数变体向量时出现“调用没有匹配函数”错误

没有匹配的函数调用奇怪的错误

如何修复“调用‘atoi’没有匹配的函数”错误?

使用 boost::bind 的调用错误没有匹配的函数

解析编译错误:没有匹配函数调用 'std::pair<,>::pair()'