unordered_map似乎没有在[]运算符上返回引用

Cof*_*ode -2 c++ unordered-map c++14

我目前有一个数据库类,其中包含一些包含数据库变量的无序映射.我编写了添加和删除变量的函数,但现在想要一种方法来轻松访问和修改它们.

我的功能是这样的:

template<typename T>
T &get(const  std::string &name){
    if(typeid(T) == typeid(int))
        return this->ints[name];
    else if(typeid(T) == typeid(float))
        return this->floats[name];

     ... ect ...
}
Run Code Online (Sandbox Code Playgroud)

如果给出了无效类型,则抛出错误.

ints是类型std::unordered_map<std::string, int> 并且floats同样定义.

对我来说,这看起来是正确的.但是当我尝试运行它时,我收到以下错误:

database.hpp:98: error: invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int'
Run Code Online (Sandbox Code Playgroud)

看起来无序地图没有返回引用,问题是什么?

Ben*_*igt 5

取消C#和Java泛型,C++模板可以是专用的.强烈建议不要以您的方式测试类型.

如果您使用了专业化,那么您就不会遇到这个问题,因为它与BartoszKP评论的转换有关.

template<typename T>
T& get(const std::string &name);
Run Code Online (Sandbox Code Playgroud)

在课外,但仍然在标题内:

template<>
int& ClassName::get<int>(const std::string &name) { return ints[name]; }

template<>
float& ClassName::get<float>(const std::string &name) { return floats[name]; }
Run Code Online (Sandbox Code Playgroud)

  • @CoffeeandCode:你无法解决的编译器错误信息对你来说不够强烈沮丧吗?我从未见过*任何*熟练的C++程序员使用`typeinfo`结构的比较.我见过专业化,并且我看到使用`enable_if <same <>>`禁用了重载 (2认同)