2011-01-16 8 views
1

Für den folgenden Code:C++ Templates Ausgabe

#include <map> 
#include <iostream> 
#include <string> 

using namespace std; 

template <class T> 
class Foo{ 
    public: 
    map<int, T> reg; 
    map<int, T>::iterator itr; 

    void add(T str, int num) { 
     reg[num] = str; 
    } 

    void print() { 
     for(itr = reg.begin(); itr != reg.end(); itr++) { 
     cout << itr->first << " has a relationship with: "; 
     cout << itr->second << endl; 
     } 
    } 
}; 

int main() { 
    Foo foo; 
    Foo foo2; 
    foo.add("bob", 10); 
    foo2.add(13,10); 
    foo.print(); 
    return 0; 
} 

ich den Fehler:

type std::map<int, T, std::less<int>, std::allocator<std::pair<const int, T> > > is not derived from type Foo<T> 

Ich habe noch nie C++ Templates verwendet - Was bedeutet das?

+0

+1 für einschließlich der Fehlermeldung. Das nächste Mal geben Sie an, auf welcher Zeile es steht (ein Kommentar im Quellcode ist eine gute Möglichkeit, dies zu erreichen). –

Antwort

3

Sie verpassen den Typ, wenn Sie Instanzen von Foo deklarieren.

In Ihrem Fall würden Sie wollen:

Foo<std::string> foo; 
    Foo<int> foo2; 

Sie müssen auch das Schlüsselwort Type-Name in die Zeile hinzufügen:

typename map<int, T>::iterator itr; 

Siehe here warum Sie Typnamen benötigen.

bearbeiten, hier ist eine modifizierte Version des Codes, die kompiliert und läuft lokal:

#include <map> 
#include <iostream> 
#include <string> 

using namespace std; 

template <class T> 
class Foo{ 
public: 
    map<int, T> reg; 
    typename map<int, T>::iterator itr; 

    void add(T str, int num) { 
     reg[num] = str; 
    } 

    void print() { 
     for(itr = reg.begin(); itr != reg.end(); itr++) { 
      cout << itr->first << " has a relationship with: "; 
      cout << itr->second << endl; 
     } 
    } 
}; 

int main() { 
    Foo<std::string> foo; 
    Foo<int> foo2; 
    foo.add("bob", 10); 
    foo2.add(13,10); 
    foo.print(); 
    return 0; 
} 
+0

Danke, aber das scheint den Fehler nicht behoben zu haben - aber es repariert ein paar andere. – Kay

+0

Die Version, die ich meinem Kommentar hinzugefügt habe, kompiliert und läuft lokal. – Mic

+0

Danke! Mein Fehler, es funktioniert :) – Kay