2016-10-22 7 views
3

Disons que j'ai cette définition de la classe mannequin:C l'appel du constructeur surchargé est ambigu

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

et les implémentations de constructeur factices à des fins éducatives ainsi:

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


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

Maintenant, si je compiler (avec les options: -Wall -Weffc++ -std=c++11) le code ci-dessous:

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

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

Je reçois cette erreur, et ne compile pas du tout:

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(); 
^

Je ne comprends pas pourquoi. Autant que je sache (j'apprends le C++), un appel à Node::Node() ne devrait pas être ambigu quant à Node::Node(const int) car ils ont une signature de paramètre différente.

Il me manque quelque chose: Qu'est-ce que c'est?

+1

Astuce: regardez la valeur par défaut dans le second constructeur. – skypjack

+0

Bien sûr, c'est vrai. Merci :). – grd

Répondre

5

Un appel à Node :: Node() ne devrait pas être ambigu par rapport à Node :: Node (const int) parce qu'ils ont une signature de paramètre différente.

Bien sûr, cela est ambigu. Pensez deux fois!

Vous avez

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

que l'on doit être sélectionné lorsque vous appelez Node() ?? Celui avec le paramètre de valeur par défaut?

Il devrait fonctionner sans fournir la valeur par défaut:

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

Le compilateur ne peut pas savoir si vous voulez appeler le constructeur par défaut ou le constructeur int avec une valeur par défaut.

Vous devez supprimer la valeur par défaut ou supprimer le constructeur par défaut (ce qui fait la même chose que votre constructeur avec int si ce n'est pas vraiment un problème!)