2017-02-05 5 views
-1

Ich schrieb Code unten, aber immer FehlermeldungWie man keinen Argumentkonstruktor in C++ aufruft?

Aufruf überladener 'Shape()' mehrdeutig ist

Wie kann ich ein, sehen gibt es kein Argument Konstruktor dann warum I bekomme ich Mehrdeutigkeit Fehlermeldung für Shape() Konstruktor, und wie kann es gelöst werden? Ich kann sehen, es funktioniert für Objekt s2 und s3, aber nicht für keinen Argument-Konstruktor.

Wenn ich erklärt s1 wie folgt:

Shape s1(); // statt Shape s1

Dann erhalte ich für print Methode der Shape folgende Meldung. Warum? und was von non-class type gemeint?

Anfrage Mitglied 'Drucken' in 's1', die von Nicht-Klasse-Typ 'Shape()'

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

Irgendeine Idee, was das bedeutet? 'Shape (int i = 10)' – juanchopanza

+2

Sie können dies lesen: http://stackoverflow.com/questions/1424510/most-vexing-parse-why-doesnt-aa-work – Rakete1111

+0

@juanchopanza - es ist ein Argument mit einem Standardwert. Wenn kein Argument angegeben wird, wird davon ausgegangen, dass 10 bestanden wurde. Aber natürlich nicht hier, denn er hatte auch einen Konstruktor ohne Argumente. – yakobom

Antwort

3

Das Problem ist es nicht heraus kann, ob nennen Shape(int i = 10) mit i = 10 oder Shape()

Form s1; könnte Shape(10); (zweiten) oder Shape(); (erster)

entweder die Standard-Eingabe auf dem zweiten Konstruktor entfernen (ersetze i = 10 -> mit i oder entfernen den ersten Konstruktor

+0

Danke, bitte erläutern Sie auch, warum ich "Mitglied 'print' in 's1', das vom Nicht-Klassen-Typ 'Shape()'" ist – Vishrant

2

Dies geschieht, weil Sie zwei anwendbare Konstruktoren haben: einen ohne Argument und einen mit einem Argument, der auch einen Standardwert hat
Wenn Sie zwei Konstruktoren haben, die beide aufgerufen werden können, welchen Aufruf sollte der Compiler machen? weiß nicht und sagt Ihnen, dass Ihr Aufruf an den Konstruktor mehrdeutig ist.

Um dies zu lösen, müssen Sie die Konstruktoren disambiguieren, indem Sie entweder den Standardwert für den zweiten Konstruktor entfernen, den Wert explizit übergeben oder einen der Konstruktoren entfernen.

Verwandte Themen