2012-04-03 3 views
1

Я написал этот маленький кодПочему использование шаблона в качестве параметра в шаблоне карты STL не поддерживается?

std::map<int,template<class T>> map_; 
map_.insert(make_pair<int,message>(myMsg.id,myMsg)); 

но компилятор не кажется, чтобы получить его и показывает как ошибка

template argument 2 is invalid 

и когда я пытался исправить, выполнив эту

template<class T> 
std::map<int,T> map_; 

он отображается как ошибка:

expected primary-expression before 'template' |

error: expected ';' before 'template'

+3

Что он должен делать? Обратите внимание, что шаблоны всегда должны быть разрешены во время компиляции. Кажется, вы хотите создать с ними полиморфный контейнер, что невозможно; вы должны использовать для этого виртуальное наследование. – leftaroundabout

+0

Ну, на самом деле, я должен хранить разные типы сообщений каждого типа на карте, поэтому я попытался создать глобальную структуру, вызвав ее «std :: map > map_;" (который не работает), поэтому класс может быть message_typeA, message_typeB и т. д. – Glolita

+0

Как я уже сказал, это невозможно. Создайте 'message_typeA',' message_typeB' производные классы 'messegetype_base', затем вы можете использовать контейнер, например. 'std :: unique_ptr' для любого из этих объектов. Это немного сложнее, чем в динамических языках (или, по крайней мере, собранных из мусора), но имеет свои преимущества (безопасность типа компиляции, хорошая производительность ...). – leftaroundabout

ответ

3

Я не уверен в этом, но вы пытаетесь объявить переменную, и это определение должно быть полностью определено. Попытка использовать шаблон не полностью определяет переменную.

Вы можете обернуть его в структуре, если вы хотите:

template<typename T> 
struct Wrapper 
{ 
    typedef std::map<int, T> map_type; 
}; 

Затем использовать его как это:

Wrapper<std::string>::map_type my_wrapped_map; 
my_wrapped_map[1] = "Foo"; 
+0

благодарит много, что сработало хорошо, но я попытался добавить еще одно поле в эту структуру: «typedef std :: map :: iterator map_type_iter;», но это показало ошибку, и я не могу понять, что с этим не так! – Glolita

0

Вы, вероятно, не с помощью C++ 11 компилятора, и эта строка недействительна:

std::map<int,template<class T>> map_; 

Это должно быть

std::map<int,template<class T> > map_; 

Обратите внимания на пространстве между > >. Pre-C++ 11, >> всегда рассматривается как оператор сдвига бит.

Помимо этого, что должен делать код? Если я не ошибаюсь, вы должны объявить свою карту, как

std::map<int,message> map_; 

Теперь std::map<int,template<class T>> map_; не имеет смысла, если это не является членом другого шаблона класса, в этом случае вам нужно

std::map<int,T> map_; 
+0

Причина для downvote? –

+0

Как узнать, какой компилятор я использую сейчас? есть ли какая-нибудь команда, которую мне нужно запустить? btw Я использую codeblocks как IDE, которая включает компилятор GCC и отладчик GDB от MinGW. – Glolita

Смежные вопросы