如何将const std :: shared_ptr插入到std :: map中

时间:2016-04-19 12:45:51

标签: c++ c++11 rvalue-reference

请考虑以下代码:

#include <string>
#include <map>
#include <memory>
#include <utility>
#include <iostream>

typedef std::shared_ptr<const std::string> ConstDataTypePtr;
typedef std::map<std::string, ConstDataTypePtr> StrDataTypeMap;

int main()
{
    StrDataTypeMap m_nameToType;
    ConstDataTypePtr vp_int8(new std::string("RGH"));
    m_nameToType.insert(std::make_pair<std::string, ConstDataTypePtr>("int8_t", vp_int8));
    return 0;
}

您必须使用以下代码进行编译:{{1​​}}。

它出现以下错误:

g++ -std=c++11 <filename>.cpp

从我正在阅读的错误中,当我尝试插入地图时,编译器期望一个r值。为什么?我在这里犯了什么错误?

请注意,我是从一些现有代码创建此代码段的,这些代码是大型代码库的一部分。可能还值得一提的是,该代码段取自在Windows上运行的代码库,我的任务是将其移植到Linux。原作者使用过std :: tr1 :: shared_ptr。我修改它以使用std :: shared_ptr。由于这种变化,我没有期待任何反响。

4 个答案:

答案 0 :(得分:5)

std::make_pair的重点是让编译器推断出类型。如果要提供类型,请使用std::pair<K, V>

所以

m_nameToType.insert(std::make_pair<std::string, std::string>("int8_t", vp_int8));

应该是:

m_nameToType.insert(std::make_pair("int8_t", vp_int8));

m_nameToType.insert(std::pair<const std::string, ConstDataTypePtr>("int8_t", vp_int8));

或简单地说:

m_nameToType.emplace("int8_t", vp_int8);

答案 1 :(得分:3)

#include <memory>
#include <map>
#include <string>

int main() {
    using shared_data = std::shared_ptr<const std::string>;

    std::map<std::string, shared_data> map;
    map.insert(std::make_pair(
        "something", 
        shared_data(new std::string("something else"))
    ));
    return 0;
}

请参阅:http://ideone.com/4AQfqd

回到你的问题;

  

testO.cpp:14:83:注意:无法转换'vp_int8'(类型'ConstDataTypePtr {aka std :: shared_ptr&gt;}')来输入'std :: basic_string&amp;&amp;'        m_nameToType.insert(std :: make_pair(“int8_t”,vp_int8));

你有什么:

std::make_pair<std::string, std::string>(some_string, TOTALLY_NOT_A_STRING)

答案 2 :(得分:3)

您为std :: make_pair模板提供了错误的类型。只需改变

m_nameToType.insert(std::make_pair<std::string, std::string>("int8_t", vp_int8));

m_nameToType.insert(std::make_pair<std::string, ConstDataTypePtr>(std::string("int8_t"), vp_int8));

(注意std::make_pair<std::string, ConstDataTypePtr>部分)

编辑:或者根本没有提供模板参数,正如有人在评论中所建议的那样。

答案 3 :(得分:0)

不要在make_pair函数中提及模板中的类型。

m_nameToType.insert(std::make_pair("int8_t", vp_int8));