错误:没有匹配函数来调用''

时间:2015-12-25 03:44:08

标签: struct stl compiler-errors

我的代码遇到了编译问题:

#include<iostream>

using namespace std;

struct TreeNode {
    int val;
    TreeNode *left, *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

int main(){
    pair <TreeNode, int> temp, node;
    return 0;
}

我不能重载不接受任何值的结构的构造函数。

错误:

/usr/include/c++/4.6/bits/stl_pair.h:100:25: error: no matching function for call to ‘TreeNode::TreeNode()’
/usr/include/c++/4.6/bits/stl_pair.h:100:25: note: candidates are:
../a.cpp:18:2: note: TreeNode::TreeNode(int)
../a.cpp:18:2: note:   candidate expects 1 argument, 0 provided
../a.cpp:15:8: note: TreeNode::TreeNode(const TreeNode&)
../a.cpp:15:8: note:   candidate expects 1 argument, 0 provided
make: *** [102_binary-tree-level-order-traversal.o] Error 1

2 个答案:

答案 0 :(得分:1)

错误是说你缺少一个没有参数的构造函数。在执行pair <TreeNode, int> temp, node时,它将使用该构造函数初始化该对,因为您没有提供显式值。

要么提供空构造函数,要么为对的构造函数提供TreeNodeint

答案 1 :(得分:1)

<强>快速解决方案

将默认构造函数添加到代码

struct TreeNode {
        int val;
        TreeNode *left, *right;
        TreeNode(){}    // DEFAULT CONSTRUCTOR
        TreeNode(int x) : val(x), left(NULL), right(NULL) {} //parameterized-constructor
};

int main(){
        pair <TreeNode, int> temp, node;  // Calls default constructor
        TreeNode t1;  // Calls default constructor
        TreeNode t2(100);  // Calls parameterized-constructor
        return 0;
}

<强>解释

如果未在 struct 中指定任何构造函数,则会隐式定义 默认构造函数 。因此,以下两个定义在逻辑上是等价的。

定义-1:

struct TreeNode {
        int val;
        TreeNode *left, *right;
};

定义-2:

struct TreeNode {
        int val;
        TreeNode *left, *right;
        TreeNode(){}  // Default Constructor
};

指定参数化构造函数时,默认构造函数不再存在。因此,您必须显式添加默认构造函数(不带参数)

以下语句(来自您的代码)调用默认构造函数,它不再存在(因为您已经定义了默认构造函数)。因此,您收到编译时错误 错误:没有匹配函数来调用'TreeNode :: TreeNode()'

 pair <TreeNode, int> temp, 

您可以通过在快速解决方案中提到的代码中添加默认构造函数来修复它。

检查出来:Does a c++ struct have a default constructor?