C++ 与map共享的ptr(错误C2664)

C++ 与map共享的ptr(错误C2664),c++,shared-ptr,C++,Shared Ptr,我有一个类,它有一个共享的\u 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

我有一个类,它有一个共享的\u 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;
}
A类{
私人:
共享ptr pMap;
A();
公众:
A(共享ptr);
A(常数A和源);
A&运算符=A(常数A&);
};
A::A(共享映射)
:_pMap(新std::shared_ptr()){
_pMap=mapPtr;
A::A(常数A和源):\u pMap(源){
A&A::运算符=(常量A和源){
if(this==&source){
归还*这个;
}
_pMap=来源_pMap;
归还*这个;
}
当我试图用主程序中包含的头编译程序时,我收到以下错误:

error C2664: 'std::_Ptr_base<_Ty>::_Reset0' : 
             cannot convert parameter 1 from 'std::shared_ptr<_Ty> *' 
             to 'std::map<_Kty,_Ty> *
错误C2664:'std:_Ptr_base::_Reset0':
无法从“std::shared_ptr*”转换参数1
到'std::map'*
但我不知道我在哪里做这件事。请有人告诉我为什么会发生这种情况

谢谢。

问题(或至少其中一个)已经解决了

A::A(shared_ptr<map<int, std::string>> mapPtr) : _pMap(new std::shared_ptr<std::map<int, std::string>>()) {
        _pMap = mapPtr;
A::A(共享的\u ptr映射):\u pMap(新的std::共享的\u ptr()){
_pMap=mapPtr;
应该是

A::A(shared_ptr<map<int, std::string>> mapPtr) : _pMap(new std::map<int, std::string>()) {
        _pMap = mapPtr;
A::A(共享的映射):\u pMap(新的std::map()){
_pMap=mapPtr;
但是初始化_pMap两次是没有意义的,所以对于这个构造函数,最好是这样做

A::A(shared_ptr<map<int, std::string>> mapPtr) : _pMap(mapPtr) { }
A::A(共享映射):\pMap(映射映射){
问题(或至少其中一个问题)在线路中

A::A(shared_ptr<map<int, std::string>> mapPtr) : _pMap(new std::shared_ptr<std::map<int, std::string>>()) {
        _pMap = mapPtr;
A::A(共享的\u ptr映射):\u pMap(新的std::共享的\u ptr()){
_pMap=mapPtr;
应该是

A::A(shared_ptr<map<int, std::string>> mapPtr) : _pMap(new std::map<int, std::string>()) {
        _pMap = mapPtr;
A::A(共享的映射):\u pMap(新的std::map()){
_pMap=mapPtr;
但是初始化_pMap两次是没有意义的,所以对于这个构造函数,最好是这样做

A::A(shared_ptr<map<int, std::string>> mapPtr) : _pMap(mapPtr) { }
A::A(共享映射):\pMap(映射映射){

我修复了代码的一部分:

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;
}
A类
{
私人:
共享ptr pMap;
A();
公众:
A(共享ptr);
A(常数A和源);
};
A::A(共享映射)
{
_pMap=mapPtr;
}
int main()
{
共享的\u ptr myMap=std::使\u共享
();
A(myMap);
返回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;
}
A类
{
私人:
共享ptr pMap;
A();
公众:
A(共享ptr);
A(常数A和源);
};
A::A(共享映射)
{
_pMap=mapPtr;
}
int main()
{
共享的\u ptr myMap=std::使\u共享
();
A(myMap);
返回0;
}

但我不确定我在哪里做这件事,如果你不发布一个完整但最小的重复错误的示例,我们也不知道。但是,为什么你要编写一个用户定义的赋值运算符和复制运算符?默认的运算符对你的类来说非常合适。我认为问题可能是
a(const a&source);
A&operator=(常量A&source)
。您需要移动构造函数和赋值
,但我不确定我在哪里执行此操作
,如果您不发布一个完整但最小的复制错误的示例,我们也不知道。但是,为什么您要编写用户定义的赋值运算符和复制构造函数?默认的运算符对您的类来说非常合适。我认为问题出在哪里可以是
A(const A&source);
A&operator=(const A&source)
。您需要移动构造函数和赋值。请注意,初始化没有任何意义。它应该是
\u pMap(mapPtr)
.Ahh.我明白了。谢谢。这是有道理的。请注意,不管怎样初始化都没有意义。它应该是
\u pMap(mapPtr)
.ah.我明白了。谢谢。这是有道理的。