2011-01-16 2 views
1

Для следующего кода:C++ шаблоны Выпуск

#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; 
} 

Я получаю ошибку:

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

Я никогда не использовал шаблоны C++ - Что это значит?

+0

+1 для включения сообщения об ошибке. В следующий раз также укажите, в какой строке он находится (помещать комментарий в исходный код - это хороший способ выполнить это). –

ответ

3

Вам не хватает типа, когда вы объявляете экземпляры Foo.

В вашем случае, вы хотите:

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

Вам также необходимо добавить ключевое слово TypeName линии:

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

См here, почему вам нужно имя типа.

Редактировать, вот модифицированная версия кода, который компилирует и запускает локально:

#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

Спасибо, но это, похоже, не исправило ошибку, но она исправляет несколько других. – Kay

+0

Версия, которую я только что добавил в свой комментарий, компилируется и запускается локально. – Mic

+0

Спасибо! Моя ошибка, это работает :) – Kay