shared_ptr与映射(错误错误C2664)

shared_ptr with map (error error C2664)

本文关键字:错误 C2664 映射 ptr shared      更新时间:2023-10-16

我有一个类的shared_ptr数据成员。下面是一个示例

class A {
private:
    shared_ptr<map<int, std::string>> _pMap;
    A();
public:
    A(shared_ptr<map<int, std::string>>); 
    A(const A& source);
    A& operator=A(const A&);
};
A::A(shared_ptr<map<int, std::string>> mapPtr) 
: _pMap(new std::shared_ptr<std::map<int, std::string>>()) {
    _pMap = mapPtr;
A::A(const A& source) : _pMap(source._p) {}
A& A::operator=(const A& source) {
    if (this == &source) {
        return *this;
    }
    _pMap = source._pMap;
    return *this;
}

当我试图用主程序中包含的头文件编译程序时,我收到以下错误:

error C2664: 'std::_Ptr_base<_Ty>::_Reset0' : 
             cannot convert parameter 1 from 'std::shared_ptr<_Ty> *' 
             to 'std::map<_Kty,_Ty> *

但我不确定我在哪里做这个。有人能告诉我为什么会发生这种情况吗?

谢谢。

问题(或至少其中一个)在

A::A(shared_ptr<map<int, std::string>> mapPtr) : _pMap(new std::shared_ptr<std::map<int, std::string>>()) {
        _pMap = mapPtr;

应该是

A::A(shared_ptr<map<int, std::string>> mapPtr) : _pMap(new std::map<int, std::string>()) {
        _pMap = mapPtr;

但是没有必要将_pMap初始化两次——所以对于这个构造函数,最好是使用

A::A(shared_ptr<map<int, std::string>> mapPtr) : _pMap(mapPtr) { }

我修复了你的部分代码:

class A 
{
private:
    shared_ptr<map<int, std::string>> _pMap;
    A();
public:
    A(shared_ptr<map<int, std::string>>);
    A(const A& source);
};
A::A(shared_ptr<map<int, std::string>> mapPtr)
{
    _pMap = mapPtr;
}
int main()
{
    shared_ptr<map<int, std::string>> myMap = std::make_shared<map<int, std::string>>
    ();
    A a(myMap);
    return 0;
}