【问题标题】:why using a template as a parameter in the STL map template is refused?为什么在 STL 地图模板中使用模板作为参数会被拒绝?
【发布时间】:2012-04-03 10:45:41
【问题描述】:

我写了这个小代码

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_;

它显示为错误:

“模板”之前的预期主表达式 |

错误:预期为 ';'在“模板”之前

【问题讨论】:

  • 它应该做什么?请注意,模板必须始终在编译时解析。看来您想用它们构建一个多态容器,这是不可能的;你必须为此使用虚拟继承。
  • 其实我应该在 map 中存储每种类型的不同类型的消息,所以我尝试通过 "std::map > 地图_;" (这也不起作用)所以类可以是 message_typeA、message_typeB 等
  • 正如我所说,这是不可能的。将message_typeAmessage_typeB 派生为messegetype_base 的类,然后您可以使用容器,例如std::unique_ptrs 到任何这些对象。它比动态语言(或至少垃圾收集的语言)稍微复杂一些,但它确实有它的好处(编译时类型安全、良好的性能......)。
  • 那么我可以用 messagetype_base 创建一个容器,然后在创建我使用 messagetype_base myMsg= new message_typeA() 的对象时??
  • 差不多。它必须是一个带有 pointersmessagetype_base 的容器,出于安全和方便的原因,我推荐std::unique_ptr

标签: c++ class templates dictionary stl


【解决方案1】:

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

如果您愿意,可以将其包装在结构中:

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";

【讨论】:

  • 非常感谢运行良好,但我尝试向此结构添加另一个字段“ typedef std::map::iterator map_type_iter;”但它显示错误,我不能不明白有什么问题!
【解决方案2】:

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

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

应该是

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

注意&gt; &gt; 之间的空格。在 C++11 之前,&gt;&gt; 始终被视为位移运算符。

除此之外,代码应该做什么?如果我没记错的话,你应该将你的地图声明为

std::map<int,message> map_;

现在,std::map&lt;int,template&lt;class T&gt;&gt; map_; 没有意义,除非这是另一个模板类的成员,在这种情况下你需要

std::map<int,T> map_;

【讨论】:

  • 我如何知道我当前使用的是哪个编译器??有什么我需要运行的命令吗?顺便说一句,我使用代码块作为 IDE,其中包括来自 MinGW 的 GCC 编译器和 GDB 调试器。
【解决方案3】:
define KEYINT_MAP(T) std::map<int, T>
KEYINT_MAP(class) map;

【讨论】:

    猜你喜欢
    • 2019-11-16
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    相关资源
    最近更新 更多