2014-07-17 49 views
0

我有一個類shared_ptr數據成員。下面是一個例子shared_ptr與地圖(錯誤錯誤C2664)

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> * 

但我不知道我在哪裏做這個。可以請某人指導爲什麼會發生這種情況?

謝謝。

+0

'但我不確定我在做什麼'我們也沒有發佈*完整的*但是最小的例子重複錯誤。但是,爲什麼要編寫用戶定義的賦值運算符並複製ctor?默認的對你的班級來說非常好。 – PaulMcKenzie

+0

我認爲問題可能是'A(const A&source);'和'A&operator =(const A&source)'。你需要移動構造函數和賦值 –

回答

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

請注意,無論如何都沒有意義。它應該是'_pMap(mapPtr)'。 – juanchopanza

+0

哦,是的,這段代碼很奇怪...... –

+0

啊。我懂了。謝謝。這就說得通了。 –

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