2016-06-20 13 views
-1

Ich habe ein kleines Projekt, ich mache auf C++. Das Projekt erfordert mich eine Template-Klasse zu schreiben, sagen läßt Klasse A. Ich habe einige Anforderungen an A, unter ihnen:Cast-Klasse zu Template-Klasse

  1. Keine dynamische Zuordnung in A-Implementierung erlaubt.
  2. A enthält einen Parameter vom Typ T (kein Zeiger, also kein "Neu").
  3. A kann leer sein (d. H. Es wurde nicht initialisiert).
  4. Man kann A in den folgenden Weisen initialisieren:

    A<int> a; 
    A<int> a(5); 
    A<int> a = 5; 
    A<int> a = Empty; 
    

ich kein Problem mit den drei ersten Arten der Initialisierung haben, aber ich bin ein wenig ratlos in Bezug auf die letzte Option.

Empty ist eine Klasse, die ich definieren sollte, wie ich will. Meine ursprüngliche Richtung war eine (leere) Klasse EmptyClass zu erstellen:

class EmptyClass {}; 

statisch ein Objekt instanziiert Leere genannt (so dass jeder der Klasse A verwendet wird, auch leer wissen):

static EmptyClass Empty; 

und das ist es. Anscheinend funktioniert es nicht.

Die gesamte (relevante) Template-Deklaration:

class A{ 
private: 
    T _Value; 
    bool _empty; 
public: 
    A(); 
    A(const T value); 
    A(const EmptyClass none); 
    A(const A& opt); 
    A(const EmptyClass & none); 
    //Checks if the object is empty 
    const bool isEmpty() const; 
    //Destructor 
    ~Optional(); 
    A<T>& operator=(const EmptyClass& rhs); 
    A<T>& operator=(const A<T>& rhs); 
}; 

Zeit einen Fehler in dieser Zeile Ich erhalte:

A<int> optionalInt = Empty 

Der Fehler ist:

error: invalid conversion from 'EmptyClass (*)()' to 'int' [-fpermissive]

ich bin darf nur den C++ 98-Standard verwenden. Möchte irgendeine Richtung für die Lösung dieses Problems bekommen.

Danke!

+0

Sie müssen die gesamte Vorlage Klassendeklaration zeigen. –

+0

Vielleicht möchten Sie etwas über [Boost optional] (http://www.boost.org/doc/libs/1_61_0/libs/optional/doc/html/index.html) erfahren (welches in C++ eingeführt wird) 17 Standard als ['std :: optional '] (http://en.cppreference.com/w/cpp/utility/optional)). Wenn Sie das nicht verwenden möchten, können Sie es zumindest als Referenz für die Erstellung Ihrer eigenen optionalen Klasse verwenden. –

+1

Für das Problem, über das Sie nachfragen, bearbeiten Sie bitte die Frage, um ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) einzuschließen, oder zeigen Sie uns mindestens die Erklärung von "leer". –

Antwort

0

Problem 1:

Sie haben zwei Konstruktoren, die einen EmptyClass als Eingabe nehmen.

A(const EmptyClass none); 
A(const EmptyClass & none); 

Beide sind gleich gute Kandidaten für die Leitung ist

A<int> a = Empty; 

Der Compiler nicht in der Lage den Konstruktor eindeutig zu machen verwendet werden.

Die einfache Lösung ist, eine von ihnen zu entfernen. Ich schlage vor, dass Sie den ersten dieser beiden Konstruktoren entfernen.

Problem 2:

Dies ist eine sehr seltsame Linie, die Sie haben.

~Optional(); 

Das muss sein:

~A(); 
+0

Hallo, danke. Das war so ziemlich das Problem. Ich habe auch einen Casting-Operator zur Klasse "none" hinzugefügt. Das optionale ist etwas, das ich vergessen habe, hier von meiner Implementierung zum vereinfachten "Modell" zu wechseln. – jayjay