无序_映射-未定义模板的隐式实例化 我的C++生疏了。我有一个成员变量,它是一个无序映射

无序_映射-未定义模板的隐式实例化 我的C++生疏了。我有一个成员变量,它是一个无序映射,c++,unordered-map,C++,Unordered Map,我试图在类构造函数中填充映射。我做错了什么 从我的标题: #include <iostream> #include <unordered_map> using namespace std; typedef enum{ GET, POST, PUT, DELETE }http_verb; class CouchServer{ string host; int port; string dbname; un

我试图在类构造函数中填充映射。我做错了什么

从我的标题:

#include <iostream>
#include <unordered_map>

using namespace std;

typedef enum{
    GET,
    POST,
    PUT,
    DELETE
}http_verb;

class CouchServer{
    string host;
    int port;
    string dbname;
    unordered_map<http_verb,string> req_types;
public:
更新:

阅读了提供的答案和评论后,我将标题更改为:

    class CouchServer{
    string host;
    int port;
    string dbname;
    unordered_map<http_verb,string> req_types;
public:
    CouchServer(std::string host, int port, std::string dbname)
    : host(std::move(host))
    , port(port)
    , dbname(std::move(dbname))
    , req_types{
        { http_verb::GET, "GET" },
        { http_verb::POST, "POST" },
        { http_verb::PUT, "PUT" },
        { http_verb::DELETE, "DELETE" }
    }
    {  }
class CouchServer{
字符串主机;
国际港口;
字符串dbname;
无序映射请求类型;
公众:
CouchServer(std::string主机,int端口,std::string数据库名)
:主机(标准::移动(主机))
,港(港)
,dbname(std::move(dbname))
,请求类型{
{http_动词::GET,“GET”},
{http_动词::POST,“POST”},
{http_动词::PUT,“PUT”},
{http_动词::DELETE,“DELETE”}
}
{  }

同样的问题依然存在。我应该提到,我正在尝试使用XCode 4编译这段代码,也就是说Apple LLVM编译器4.2。

这可能是编译器的限制。在GCC 4.7.2中,类似的东西也适用于我,而且标准确实说有一个赋值运算符接受初始值设定项列表

但是您不应该在构造函数中执行任何赋值!最好使用构造函数初始值设定项列表:

CouchServer(std::string host, int port, std::string dbname)
: host(std::move(host))
, port(port)
, dbname(std::move(dbname))
, req_types { { http_verb::GET, "GET" } }  // etc.
{  }
(当然,永远不要在头文件中说
滥用名称空间std;


您必须为您的枚举专门化
std::hash
;将其转换为合适的整数类型应该可以做到这一点。

如何访问
req_类型[GET]
在初始值设定项列表中?我认为在构建时,
req\u types
是空的。你的意思是
http\u verb::GET
?无论如何,这无助于解决
std::hash不是专门用于http\u verb
(我也在使用gcc 4.7.2)编写成员初始化程序的方式看起来就像Haskell中的东西。在C++中也很常见吗?@ IXANZEIS:是的,我已经做了。你必须专门研究代码> STD::散列,当然。“滥用名称空间STD”;为什么不呢?我很感兴趣:)@didierc:我喜欢这种风格,因为它缩进很好,而且很容易按行编辑……你需要创建一个简单的、自包含的编译示例。这意味着你需要一行一行地删除代码(或者成对地删除
std::string主机;
行和
host(std::move(host))
initializer,每次检查是否仍然出现相同的编译器错误。当您没有更多的代码要删除,并且错误仍然发生时,您将看到一个简短的、自包含的编译示例来演示您的问题。这是必需的,因为我们不会阅读超过1000行的代码,您不知道该执行什么操作当你把它缩短的时候,nes实际上很重要。你能给出错误信息吗?我这里没有mac电脑来测试。
CouchServer(std::string host, int port, std::string dbname)
: host(std::move(host))
, port(port)
, dbname(std::move(dbname))
, req_types { { http_verb::GET, "GET" } }  // etc.
{  }