shared_ptr with map(错误错误C2664)

时间:2014-07-17 21:44:20

标签: c++ shared-ptr

我有一个带有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> *

但我不知道我在做什么。可以请某人指导为什么会发生这种情况吗?

感谢。

2 个答案:

答案 0 :(得分:4)

问题(或至少有一个)在行

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) { }

答案 1 :(得分:0)

我修复了部分代码:

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