Допустим, у меня есть это фиктивное определение класса:
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)
потому что имеют другую сигнатуру параметра.
Есть кое-что, чего мне не хватает: что это?
вызов Node :: Node () не должен быть неоднозначным по отношению к Node :: Node (const int), поскольку они имеют другую сигнатуру параметра.
Конечно, это неоднозначно. Подумай дважды!
У тебя есть
Node ();
Node (const int = 0);
какой из них должен быть выбран при звонке Node()
?? Тот, с параметром по умолчанию?
Он должен работать без предоставления значения по умолчанию:
Node ();
Node (const int); // <<<<<<<<<<<<< No default
Компилятор просто не может знать, хотите ли вы вызвать конструктор по умолчанию или int
конструктор со значением по умолчанию.
Вы должны удалить значение по умолчанию или удалить конструктор по умолчанию (который делает то же самое, что ваш конструктор с int
так что на самом деле это не проблема!)