2016-10-22 57 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; 
}  

をI場合以下のコードをコンパイルしてください(オプション:-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()への呼び出しは、に関してはあいまいであってはなりません。

私には何かがあります:それは何ですか?

+1

ヒント:二コンストラクタのデフォルト値を見てください。 – skypjack

+0

確かに、それは本当です。ありがとう:) – grd

答えて

5

Node :: Node(const int)は、異なるパラメータシグニチャを持つため、Node :: Node()の呼び出しはあいまいであってはいけません。

確かにあいまいです。考え直してください!

あなたはNode()を呼び出すときに1が選択されなければならない

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

を持っています?デフォルト値のパラメータを持つもの?

それはデフォルトを提供せずに動作するはずです:

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

デフォルト値とデフォルトコンストラクタまたはintコンストラクタを呼び出したい場合は、コンパイラだけで知ることができません。

あなたが(!intを使用して、コンストラクタと同じことをしているので、それは本当に問題ではない)のデフォルト値を削除するか、デフォルトコンストラクタを削除する必要が

関連する問題