C++ 为什么拒绝将模板用作STL映射模板中的参数?

C++ 为什么拒绝将模板用作STL映射模板中的参数?,c++,class,templates,dictionary,stl,C++,Class,Templates,Dictionary,Stl,我写了这个小代码 std::map<int,template<class T>> map_; map_.insert(make_pair<int,message>(myMsg.id,myMsg)); 当我试图通过这样做来纠正时 template<class T> std::map<int,T> map_; 模板 std::map; 它显示为一个错误: “模板”之前应为主表达式| 错误:应为“;”在“模板”之前 您可能没有使用C++

我写了这个小代码

std::map<int,template<class T>> map_;
map_.insert(make_pair<int,message>(myMsg.id,myMsg));
当我试图通过这样做来纠正时

template<class T>
std::map<int,T> map_;
模板
std::map;
它显示为一个错误:

“模板”之前应为主表达式|

错误:应为“;”在“模板”之前


您可能没有使用C++11编译器,此行无效:

std::map<int,template<class T>> map_;
现在,
std::map没有真正的意义,除非这是另一个模板类的成员,在这种情况下,您需要

std::map<int,T> map_;
std::map\ux;

您可能没有使用C++11编译器,此行无效:

std::map<int,template<class T>> map_;
现在,
std::map没有真正的意义,除非这是另一个模板类的成员,在这种情况下,您需要

std::map<int,T> map_;
std::map\ux;

我不确定这一点,但您正试图声明一个变量,必须完全定义该定义。尝试使用模板并不能完全定义变量

如果需要,可以将其包装在结构中:

template<typename T>
struct Wrapper
{
    typedef std::map<int, T> map_type;
};
模板
结构包装器
{
typedef std::map映射类型;
};
然后像这样使用它:

Wrapper<std::string>::map_type my_wrapped_map;
my_wrapped_map[1] = "Foo";
Wrapper::map\u键入my\u wrapped\u map;
我的地图[1]=“Foo”;

我不确定这一点,但您正试图声明一个变量,必须完全定义该定义。尝试使用模板并不能完全定义变量

如果需要,可以将其包装在结构中:

template<typename T>
struct Wrapper
{
    typedef std::map<int, T> map_type;
};
模板
结构包装器
{
typedef std::map映射类型;
};
然后像这样使用它:

Wrapper<std::string>::map_type my_wrapped_map;
my_wrapped_map[1] = "Foo";
Wrapper::map\u键入my\u wrapped\u map;
我的地图[1]=“Foo”;
定义关键点地图(T)标准::地图
KEYINT_图(类)图;
定义关键点地图(T)标准::地图
KEYINT_图(类)图;

它应该做什么?请注意,模板必须始终在编译时解析。似乎你想用它们构建一个多态容器,这是不可能的;实际上,我应该在一个映射中存储每种类型的不同类型的消息,所以我试图通过调用“std::map map_;”(这两种方法都不起作用)来创建一个全局结构,所以类可以是message_typeA,message_typeB,等等。我说过,这是不可能的。使
message\u typeA
message\u typeB
派生类成为
messegetype\u base
,然后您可以对这些对象中的任何一个使用一个容器,例如
std::unique\u ptr
s。它比动态语言(或者至少是垃圾收集语言)要复杂一点,但它确实有它的好处(编译时类型安全,性能良好…)。因此,我可以用messagetype_base创建一个容器,然后在创建对象时,我几乎使用messagetype_base myMsg=new message_typeA()。它必须是一个带有指向
messagetype\u base
指针的容器,出于安全和方便的原因,我建议使用
std::unique\u ptr
。它应该做什么?请注意,模板必须始终在编译时解析。似乎你想用它们构建一个多态容器,这是不可能的;实际上,我应该在一个映射中存储每种类型的不同类型的消息,所以我试图通过调用“std::map map_;”(这两种方法都不起作用)来创建一个全局结构,所以类可以是message_typeA,message_typeB,等等。我说过,这是不可能的。使
message\u typeA
message\u typeB
派生类成为
messegetype\u base
,然后您可以对这些对象中的任何一个使用一个容器,例如
std::unique\u ptr
s。它比动态语言(或者至少是垃圾收集语言)要复杂一点,但它确实有它的好处(编译时类型安全,性能良好…)。因此,我可以用messagetype_base创建一个容器,然后在创建对象时,我几乎使用messagetype_base myMsg=new message_typeA()。它必须是一个带有指向
messagetype\u base
指针的容器,出于安全和方便的原因,我建议使用
std::unique\u ptr
。我如何知道当前使用的编译器??是否有任何命令需要运行??顺便说一句,我使用代码块作为IDE,其中包括来自MinGW的GCC编译器和GDB调试器。我如何知道我当前使用的是哪种编译器??是否有任何命令需要运行??顺便说一句,我正在使用代码块作为IDE,其中包括来自MinGW的GCC编译器和GDB调试器。非常感谢它工作得很好,但我尝试在这个结构中添加另一个字段“typedef std::map::iterator map_type_iter;”,但它显示了一个错误,我看不出有什么问题!非常感谢,它工作得很好,但我尝试向这个结构添加另一个字段“typedef std::map::iterator map_type_iter;”,但它显示了一个错误,我不知道它有什么问题!