2016-05-06 11 views
-1

Ich versuche, einen überladenen Operator für eine Klasse mit den folgenden Mitgliedern und Funktionen zu verwenden:Mehrdeutige Aufruf Konstruktor von überladener Operator-Funktion in C++

class MyVector { 

    private: 
    int   *data; 
    unsigned int vector_size; 

    public: 
    MyVector(); 
    MyVector(unsigned int n); 
    MyVector(unsigned int size, int *in_array=NULL); 
    MyVector(const MyVector& copy); 
    ~MyVector(); 
    void print(); 

    // Assignment operator. 
    MyVector& operator=(const MyVector& v); 

    friend MyVector operator*(const int &lhs, MyVector &rhs); 

    friend MyVector operator*(MyVector &rhs, int &lhs); 

    MyVector operator*(MyVector &vector); 
}; 

// Implementing operator overloading. 
MyVector operator*(int &lhs, MyVector &rhs); 
MyVector operator*(MyVector &lhs, int &rhs); 

Innerhalb einem meiner Bedienfunktionen Überlastung, ist es das, was ich versuche zu tun:

MyVector operator*(const int &lhs, MyVector &rhs) { 

    unsigned int size = rhs.vector_size; 

    // Create new vector. 
    MyVector *v = new MyVector(static_cast<unsigned int>(size)); 

    for (unsigned int i = 0; i < rhs.vector_size; i++) { 
     v -> data[i] = lhs * rhs.data[i]; 
    } 

    return *v; 
} 

ich die folgende Fehlermeldung erhalten:

MyVector_fxns.cpp: In function 'MyVector operator*(const int&, MyVector&)': 
MyVector_fxns.cpp:42:60: error: call of overloaded 'MyVector(unsigned int)' is ambiguous 
    MyVector *v = new MyVector(static_cast<unsigned int>(size)); 

Bevor Sie dies als Duplikat markieren, habe ich this link überprüft und keine der Lösungen funktionierte für mich.

Von den drei möglichen Konstruktoren sollte nur 1 hier aufgerufen werden. Was verursacht den Fehler, obwohl ich den korrekten Typ im Konstruktorargument übergebe?

+0

Dieser Code verliert Speicher. Sie haben ein neues Objekt zugewiesen, und Sie haben keine Möglichkeit, 'delete' für den zurückgegebenen Zeigerwert aufzurufen. Ihr 'operator *' sollte lokal ein 'MyVector'-Objekt erstellen und es nach Wert zurückgeben. Entfernen Sie den Aufruf von 'new', nur' MyVector v (static_cast (size)); ... return v; 'ist alles was Sie brauchen. – PaulMcKenzie

Antwort

3
MyVector(unsigned int n); 
    MyVector(unsigned int size, int *in_array=NULL); 

Dies ist mehrdeutig. In Anbetracht des oben Konstrukteure:

MyVector v(10); 

Diese können entweder eine dieser beiden Konstrukteure, mit dem zweiten Parameter des zweiten Konstruktor Verzug geraten. Darüber beschwert sich der Compiler. Der Compiler weiß nicht, welchen Konstruktor er verwenden soll. Es kann beides verwenden. Es kann nicht allein entscheiden, oder umdrehen oder Münze oder etwas. Wenn es darum geht, C++ - Code zu kompilieren, können Sie nicht einfach eine Münze werfen und einen Konstruktor auswählen.

Die Fehlermeldung besagt dies buchstäblich. Es ist ein sehr klarer Kompilierungsfehler:

call of overloaded 'MyVector(unsigned int)' is ambiguous

Sie haben einen überladenen Konstruktor. Und es ist mehrdeutig.

+0

Wenn es nur ein Argument gibt, warum sollte es überhaupt mit dem zweiten Konstruktor zu tun haben? Ich denke, das Entfernen des Standardwerts der 'in_array' -Variablen wird es beheben, aber ich habe einfach angenommen, dass es automatisch den ersten Konstruktor berücksichtigt, weil es nur ein Argument gibt. –

+1

@ Objective-J Warum sollte das zweite Argument im zweiten Konstruktor optional sein, wenn es den ersten Konstruktor verwenden sollte, wenn es kein zweites Argument gibt? – Barmar

+0

Da der zweite Konstruktor auch mit einem Argument aufgerufen werden kann. Wenn Sie einen Standardparameter deklarieren und diesen nicht angeben, können Sie die Funktion oder den Konstruktor immer noch ohne sie aufrufen. So funktioniert C++. Wenn Sie möchten, dass alle Konstruktoraufrufe mit einem Argument den ersten Konstruktor aufrufen und alle Konstruktoraufrufe mit zwei Argumenten den zweiten aufrufen, müssen Sie den Standardwert "= null" loswerden. –

Verwandte Themen