请考虑以下代码:
#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。由于这种变化,我没有期待任何反响。
答案 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;
}
回到你的问题;
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));