2016-10-22 3 views
3

Скажем, у меня есть это фиктивное определение класса:C++ вызов перегруженного конструктора неоднозначен

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; 
}  

Теперь, если я compile (с опциями: -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), потому что у них есть другая сигнатура параметра.

Что-то мне не хватает: что это такое?

+1

Подсказка: посмотрите на значения по умолчанию во втором конструкторе. – skypjack

+0

Конечно, это правда. Благодаря :). – grd

ответ

5

вызов Node :: Node() не должен быть двусмысленным относительно Node :: Node (const int), потому что у них есть другая сигнатура параметра.

Уверенный, что неоднозначный. Подумай дважды!

Вы

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

, который один должен быть выбран, когда вы звоните Node() ?? Тот, у которого установлен параметр значения по умолчанию?

Он должен работать без обеспечения по умолчанию:

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

компилятор просто не может знать, если вы хотите вызвать конструктор по умолчанию или int конструктор со значением по умолчанию.

Вы должны удалить значение по умолчанию или удалить конструктор по умолчанию (который делает то же самое, что ваш конструктор с int, так что это не проблема!)

 Смежные вопросы

  • Нет связанных вопросов^_^