【问题标题】:How to make a generic map using template in C++如何在 C++ 中使用模板制作通用地图
【发布时间】:2013-05-16 05:32:30
【问题描述】:

我正在尝试创建一个通用的map,它将any datatype 作为它的第二个元素。 但是当我尝试创建一个对象时,我收到错误argument list for class template is missing

template<typename T1>
class MAP{
public:
    std::map<string, T1>Hello;

    //MAP(){Hello["Hello"] = 3;}
};

int main()
{
    MAP map1;//Error happens here

    return 0;
}

这里出了什么问题?

【问题讨论】:

  • MAP 不是类型。 MAP&lt;int&gt; 是。 MAP&lt;char&gt; 是。 MAP&lt;double&gt; 是。 MAP&lt;MAP&gt; 是。
  • 如果您想要一个地图对象能够同时存储多种不同类型的元素,您需要停下来再想一想。你会用这样的地图做什么?你将如何操作它的元素?否则你已经有了一个通用地图,它叫做std::map
  • @chris MAP&lt;MAP&gt; 不是类型,而是错误。 MAP&lt;MAP&lt;int&gt;&gt; 是一种类型。
  • @Angew,糟糕,感谢您纠正我。我本来想说MAP&lt;YourOwnClass&gt;,然后我把它切换到MAP,因为它已经定义了,我想我忘了这意味着我需要一个额外的模板参数:p

标签: c++ visual-studio-2010 templates arguments


【解决方案1】:

根据您的代码示例,而不是问题的描述,看起来您尝试实现的内容可以用别名模板表示:

template <typename V>
using MAP = std::map<std::string, V>;

这需要 C++11 支持。但是MAP 的实例只能有一个映射类型V,如您的代码示例中所示。

MAP<int> mi;    // std::map<std::string, int>
MAP<double> md; // std::map<std::string, double>

如果您想将任何类型存储为映射类型,您可以考虑使用 Boost.Any 的映射

using ANYMAP = std::map<std::string, boost::any>;

ANYMAP m;
m["Hello"] = 42;
m["Bye"] = std::string("message");

但是你必须仔细考虑如何使用这种结构。

【讨论】:

    猜你喜欢
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2014-03-15
    • 1970-01-01
    相关资源
    最近更新 更多