c++ - 如何将 const std::shared_ptr 插入 std::map

标签 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;
}

你必须编译它:g++ -std=c++11 <filename>.cpp .

它给出了以下错误:

    testO.cpp: In function ‘int main()’:
testO.cpp:14:88: error: no matching function for call to ‘make_pair(const char [7], ConstDataTypePtr&)’
     m_nameToType.insert(std::make_pair<std::string, ConstDataTypePtr>("int8_t", vp_int8));
                                                                                        ^
testO.cpp:14:88: note: candidate is:
In file included from /usr/include/c++/4.8.2/bits/stl_algobase.h:64:0,
                 from /usr/include/c++/4.8.2/bits/char_traits.h:39,
                 from /usr/include/c++/4.8.2/string:40,
                 from testO.cpp:1:
/usr/include/c++/4.8.2/bits/stl_pair.h:276:5: note: template<class _T1, class _T2> constexpr std::pair<typename std::__decay_and_strip<_Tp>::__type, typename std::__decay_and_strip<_T2>::__type> std::make_pair(_T1&&, _T2&&)
     make_pair(_T1&& __x, _T2&& __y)
     ^
/usr/include/c++/4.8.2/bits/stl_pair.h:276:5: note:   template argument deduction/substitution failed:
testO.cpp:14:88: note:   cannot convert ‘vp_int8’ (type ‘ConstDataTypePtr {aka std::shared_ptr<const std::basic_string<char> >}’) to type ‘std::shared_ptr<const std::basic_string<char> >&&’
     m_nameToType.insert(std::make_pair<std::string, ConstDataTypePtr>("int8_t", vp_int8));

从我读到的错误来看,编译器在我尝试插入映射时需要一个 r 值。为什么?我在这里犯了什么错误?

请注意,我是根据一些现有代码创建此代码段的,这些代码是大型代码库的一部分。可能还值得一提的是,该片段取自在 Windows 上运行的代码库,我的任务是将其移植到 Linux。原作者使用了 std::tr1::shared_ptr。我将其修改为使用 std::shared_ptr。我没想到会因为这个改变而产生任何影响。

最佳答案

整点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);

关于c++ - 如何将 const std::shared_ptr 插入 std::map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36718822/

相关文章:

c++ - foo({0, 0}) : Is this using initializer lists?

c++ - 接收器参数和异常

c++ - 对数组 : can it actually happen? 的右值引用

c# - 如果是 Windows 上的 HID 设备,如何获取供应商和产品字符串?

c++ - 吃 bean 游戏的东西没有申报?

C++ 模板 : cannot match the last template in variadic class template

c++ - 右值引用可以作为 const 引用传递吗?

c++ - 使用 Visual C++ 6 项目的选项

c++ - C++ 中的名称冲突

c++ - boost::process 抛出 LNK2019:未解析的外部符号