c++ - 使用 std::shared_ptr 的 std::map 调用 const 重载函数

标签 c++ c++11 stl shared-ptr

我正在尝试调用一个 const 重载函数

void process(std::map<std::string,std::shared_ptr<const Data_Struct>>);

使用我生成的数据。因为我生成数据,所以我使用了非常量版本

std::map<std::string,std::shared_ptr<Data_Struct>> my_data;

当我尝试调用我的函数时

process(my_data);

我得到错误:

error C2664: 'void process(std::map<std::string,std::shared_ptr<const Data_Struct>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>)' : cannot convert argument 1 from 'std::map<std::string,std::shared_ptr<Data_Struct>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>' to 'std::map<std::string,std::shared_ptr<const Data_Struct>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>'

我尝试了多种类型转换变体,但都无法完成工作。感谢您的帮助。

这是我的测试代码,其中包含转换变体和相关的错误代码(我使用的是 Visual C++ 社区版 2013):

struct Data_Struct
{
    int a;
    std::string b;
};

void process(std::map<std::string,std::shared_ptr<const Data_Struct>>);

void calling_function() {
    std::map<std::string,std::shared_ptr<Data_Struct>> my_data;
    my_data.emplace("test",std::shared_ptr<Data_Struct>(new Data_Struct)).first->second->a = 2;
    process(my_data);
        // error C2664: 'void process(std::map<std::string,std::shared_ptr<const Data_Struct>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>)' : cannot convert argument 1 from 'std::map<std::string,std::shared_ptr<Data_Struct>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>' to 'std::map<std::string,std::shared_ptr<const Data_Struct>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>'
    process(std::map<std::string,std::shared_ptr<const Data_Struct>>(my_data));
        // error C2440: '<function-style-cast>' : cannot convert from 'std::map<std::string,std::shared_ptr<Data_Struct>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>' to 'std::map<std::string,std::shared_ptr<const Data_Struct>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>'
    process((std::map<std::string,std::shared_ptr<const Data_Struct>>)my_data);
        // error C2440: 'type cast' : cannot convert from 'std::map<std::string,std::shared_ptr<Data_Struct>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>' to 'std::map<std::string,std::shared_ptr<const Data_Struct>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>'
    process(static_cast<std::map<std::string,std::shared_ptr<const Data_Struct>>>(my_data));
        // error C2440: 'static_cast' : cannot convert from 'std::map<std::string,std::shared_ptr<Data_Struct>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>' to 'std::map<std::string,std::shared_ptr<const Data_Struct>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>'
    process(reinterpret_cast<std::map<std::string,std::shared_ptr<const Data_Struct>>>(my_data));
        // error C2440: 'reinterpret_cast' : cannot convert from 'std::map<std::string,std::shared_ptr<Data_Struct>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>' to 'std::map<std::string,std::shared_ptr<const Data_Struct>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>'
    process(const_cast<std::map<std::string,std::shared_ptr<const Data_Struct>>>(my_data));
        // error C2440: 'const_cast' : cannot convert from 'std::map<std::string,std::shared_ptr<Data_Struct>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>' to 'std::map<std::string,std::shared_ptr<const Data_Struct>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>'
    process(std::static_pointer_cast<std::map<std::string,std::shared_ptr<const Data_Struct>>>(my_data));
        // error C2784: 'std::shared_ptr<_Ty> std::static_pointer_cast(const std::shared_ptr<_Ty2> &) throw()' : could not deduce template argument for 'const std::shared_ptr<_Ty2> &' from 'std::map<std::string,std::shared_ptr<Data_Struct>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>'
    process(std::const_pointer_cast<std::map<std::string,std::shared_ptr<const Data_Struct>>>(my_data));
        // error C2784: 'std::shared_ptr<_Ty> std::const_pointer_cast(const std::shared_ptr<_Ty2> &) throw()' : could not deduce template argument for 'const std::shared_ptr<_Ty2> &' from 'std::map<std::string,std::shared_ptr<Data_Struct>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>'
}

void process(std::map<std::string,std::shared_ptr<const Data_Struct>> data) {
    for(auto &d : data)
        std::cout << d.first << std::endl;
}

最佳答案

这两种 map 类型完全无关,尽管表面上相似,但不能互换使用。不过,您确实有几个选择:

  • 在其构造函数中填充您的数据类,这样您就不必在创建后更改它。
  • 让流程函数在模板化迭代器范围而不是特定容器上工作。
  • 让流程函数在模板化容器而不是特定类型上运行。

关于c++ - 使用 std::shared_ptr 的 std::map 调用 const 重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30110470/

相关文章:

c++ - 计算最小N的置位位数

c++ - 这两个函数签名有什么区别?

c++ - std::array 与用于连续内存的 C 样式数组

c++ - g++找不到头文件

c++ - C++中的"Free"数组元素

c++ - 从 hana::tuple_t 到 hana::tuple

c++ - 调用复制 ctor 而不是移动 ctor

c++ - 为什么 std::mutex 比 CRITICAL_SECTION 慢两倍

c++ - std::basic_string 中的 push_back() 与序列容器

c++ - 如果我们在 STL 容器中传递用户定义的对象,对象销毁的顺序是什么?