2010-12-08 16 views
1

Ich mache einige Stapel, in denen ich diese Art von Vergleich in einer Funktion verwenden muss. Aber ich bin stecken geblieben, da ich nicht weiß, wie der Prototyp dafür aussehen soll.Template-Klasse und Überladung '=='

Ich habe folgende Zeile in einer Funktion.

template <class T> 
void function1(T i) 
{ 
    if(i == 'a') 
     //do something 
} 

Ich frage mich, wie der Überladungsprototyp dafür aussehen sollte?

EDIT weiß nicht, ob es sich lohnt auf jeden Fall zu erwähnen, ist das, was ich Vorlage so weit

bool Stack<T>::operator==(char c) const 
{ 
    cout << c << endl; // just some test 
} 

Keine Notwendigkeit, zu kommentieren, wie diese Funktion funktioniert versucht haben, wie ich es noch nicht fertig sind. Dieser Teil wird kompiliert, jedoch an dem Teil, an dem ich diese Funktion zum ersten Mal anrufe, ist im Stack :: push (T i). Der Compiler wird sich beschweren, dass es keine passende Funktion dafür gibt.

error: no match for 'operator==' in 'i == '#'' 
+0

Zeigen Sie uns, was Sie bisher versucht habe: Ich kann nicht sagen, was du bist fragen von der Frage, aber ein Beispiel könnte klären. –

+0

Ihre Frage ist nicht klar. Ihre Template-Funktion ist in Ordnung, wenn die 'if'-Anweisung abgeschlossen ist. Aber es geht davon aus, dass man "i == 'a'' vergleichen kann. Ist die Frage, wie man das für einen Typ "T" möglich macht, oder wie man diese Zeile verallgemeinert, um kein 'char'-Literal zu verwenden? – aschepler

+0

@aschepler: Ich möchte so machen, dass ich Typ T mit einem Charakter vergleichen kann, seit irgendeinem Punkt, wenn ich dieses Programm führe, muss ich diesen Vergleich machen. – starcorn

Antwort

1

Für Überlastung Betreiber ist der Name der Funktion operator durch den tatsächlichen Betreiber gefolgt, so operator==. Es gibt Bool zurück. Ich weiß nicht, was deine Argumente auf deinem Code basieren sollten. Wahrscheinlich Stack<T>&, und Sie müssen zwei von ihnen zu vergleichen, wenn es eine freie Funktion ist, und eine, um dies zu vergleichen, wenn es eine Elementfunktion ist.

Wenn Sie Möglichkeiten haben, in eine Stack<T> zu konvertieren, dann bevorzugen Sie eine freie Funktion, so dass Sie die linke Seite konvertieren können.

0

Ich bin mir nicht sicher, ob ich Ihre Frage verstehe. Damit die Template-Funktion function1 instanziiert werden kann, müssen Sie eine operator== bereitstellen, die eine T und (ich nehme an) eine char vergleicht.

Nun haben Sie zwei Möglichkeiten:

  • Geben Sie eine bool operator==(char) const Member-Funktion in Ihrer Art, zum Beispiel:

    struct A { 
        bool operator==(char) const { /* ... */ } 
    }; 
    
    
    function1(A()); // OK : comparison uses A::operator==(char) 
    
  • bool operator==(const T &, char) als freie Funktion, zum Beispiel für Sie:

    struct A { /* ... */ }; 
    bool operator==(const A &, char) { /* ... */ } 
    
    
    function1(A()); // OK : comparison uses operator==(const A &, char) 
    
0

Also muss jedes T in Ihrer Funktion1 (t) den Operator == implementieren;

Zum Beispiel als Mitglied Funktion

class A 
{ 
public: 
    bool operator == (char) const; 
}; 

oder ein Nicht-Mitglied Betreiber:

class A 
{ 
public: 
    friend bool operator == (const A&, char); 
}; 
+0

Ich habe das schon ausprobiert, es würde mir Kompilierfehler geben. Ich habe meine Frage mit diesem Fehler bearbeitet – starcorn

+0

Es ist schwer zu sagen, was Sie tatsächlich versucht haben, weil es kein vollständiges Codefragment gibt, also versuchen alle einfach zu erraten. Wie es in diesem Thread gesagt wurde, müssen Sie operator == (member function oder free) für den Typ T in Ihrer Funktion1 (T i) bereitstellen, ich sehe nicht, was Stack <> damit zu tun hat, es sei denn Variable seiner Art geliefert an die Funktion. –