2017-02-05 16 views
-1

私はなぜ、その後、コードの下に書きましたが、私は何の引数のコンストラクタがありません見ることができるように、オーバーロードのエラーメッセージC++で引数コンストラクタを呼び出す方法は?

コール「形状を()」得ることが

曖昧ですShape()コンストラクタのあいまいさエラーメッセージが表示され、 how解決できますか?私はオブジェクト s2s3の作業を見ることができますが、引数のコンストラクタは表示されません。

次のように私はs1を宣言しています:

Shape s1(); //の代わりに、Shape s1

その後、私はShapeprint方法については、次のメッセージを取得しています。 なぜですか? non-class typeが何を意味するのか?非クラスタイプである「S1」のメンバ「プリント」の

要求、「形()」

class Shape { 

    int j; 

    public: 
     int i; 
     const char* const c; 

     double print() const { 
      printf("Value of i is %d, j is %d and c is %s\n", i, j, c); 
      return 0; 
     } 

     Shape() : 
       i(10), j(0), c("Some string") { 
     } 
     Shape(int i = 10) : 
       i(10), j(10), c("Some String") { 
      this->i = i; 
     } 

     Shape(char* c) : 
       i(), j(), c(strcpy(new char[strlen(c)], c)) { 
     } 
}; 

int main() { 
    Shape s1; // call of overloaded 'Shape()' is ambiguous 

    Shape* s2 = new Shape(1); 

    Shape s3("Some string"); 

    s1.print(); // When using Shape s1() I am getting request for 
       // member 'print' in 's1', which is of non-class type 'Shape()' 

    return 0; 
} 
+2

これはどういう意味ですか? 'Shape(int i = 10)' – juanchopanza

+2

あなたはこれを読んでみたいです:http://stackoverflow.com/questions/1424510/most-vexing-parse-why-doesnt-aa-work – Rakete1111

+0

@juanchopanza - 引数ですデフォルト値を使用します。引数が与えられない場合、10が渡されたものとみなされます。しかし、ここではもちろん、彼は議論のないコンストラクタも持っていたからです。 – yakobom

答えて

3

問題は、それが呼び出すかどうかを把握することはできませんです Shape(int i = 10) i = 10 またはShape()

シェイプs1; いずれか Shape(10);(1秒) 又は Shape();(最初の)

である第二のコンストラクタのデフォルトの入力を削除する(I = 10置き換えることができる - > Iを有する又はこれが起こる最初のコンストラクタ

+0

ありがとう、私は 'member 'print' in 's1'を取得していますが、これは非クラス型の 'Shape()'' – Vishrant

2

を削除します
2つのコンストラクタがあり、どちらも呼び出すことができますが、どちらを呼び出すことができますか?明らかにコンパイラはdoesnコンストラクタへのあなたの呼び出しがあいまいであることを知り、あなたに伝えます。

これを解決するには、2番目のコンストラクタのデフォルト値を削除するか、値を明示的に渡すか、コンストラクタの1つを削除するかのいずれかによって、コンストラクタの曖昧さを解決する必要があります。

関連する問題