重载构造函数的C ++调用是不明确的

时间:2016-10-22 17:11:03

标签: c++ c++11 constructor default constructor-overloading

我们说我有这个虚拟类定义:

    class Node
    {
    public:
        Node ();
        Node (const int = 0);
        int getVal();
    private:
        int val;
    };

虚拟构造函数实现仅用于教育目的:

Node::Node () : val(-1)
{
    cout << "Node:: DEFAULT CONSTRUCTOR" << endl;
}


Node::Node(const int v) : val(v) 
{
    cout << "Node:: CONV CONSTRUCTOR val=" << v << endl;
}    

现在,如果我编译(带选项:-Wall -Weffc++ -std=c++11)下面的代码:

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

int main()
{   
    Node n;
    return 0;
}

我收到此错误,根本无法编译:

node_client.CPP: In function ‘int main()’:
node_client.CPP:10:16: error: call of overloaded ‘Node()’ is ambiguous
  Node n;  
                ^
node_client.CPP:10:16: note: candidates are:
In file included from node_client.CPP:4:0:
node.h:14:5: note: Node::Node(int)
     Node (const int = 0);     
     ^
node.h:13:2: note: Node::Node()
  Node ();
  ^

我无法理解为什么。

据我所知(我正在学习C ++),对Node::Node()的调用不应该与Node::Node(const int)有关,因为它具有不同的参数签名。

我遗失了一些东西:它是什么?

2 个答案:

答案 0 :(得分:8)

  

对Node :: Node()的调用对于Node :: Node(const int)不应该是模糊的,因为它有不同的参数签名。

当然这是模棱两可的。三思而后行!

你有

    Node ();
    Node (const int = 0);

当你致电Node()时,应该选择哪一个?具有默认值参数的那个?

它可以在不提供默认值的情况下工作:

    Node ();
    Node (const int); // <<<<<<<<<<<<< No default

答案 1 :(得分:4)

编译器无法知道您是否要使用默认值调用默认构造函数或int构造函数。

你必须删除默认值或删除默认构造函数(它与构造函数的作用与int相同,所以这不是真正的问题!)