2017-10-06 115 views
0

我使用的是std::shared_ptr指向一個節點C++的std :: shared_ptr的錯誤C2664

template<typename T> 
class A 
{ 
    class Node 
    { 
     T data; 
     std::shared_ptr<Node> link; 
     Node(T data, std::shared_ptr<Node> link); 
    }; 
    void push(T data); 
    std::shared_ptr<Node> top; 
}; 

template<typename T> 
A<T>::Node::Node(T data, std::shared_ptr<typename A<T>::Node> link) : 
data(data), link(link) 
{ 
} 

template<typename T> 
void A<T>::push(T item) 
{ 
    if (top == nullptr) 
    { 
     top = std::make_shared<typename A<T>::Node>(new typename 
                A<T>::Node(item, nullptr)); 
    } 
    else 
    { 
     top = std::make_shared<typename A<T>::Node>(new typename A<T>::Node(item, top)); 
    } 
} 

生成的聲明和定義導致編譯器錯誤

嚴重性代碼說明項目文件行抑制狀態 錯誤C2664'Stack :: Node :: Node(const Stack :: Node &)':無法將參數1從'Stack :: Node *'轉換爲'const stack :: Node &'內存901

我需要更改以符合<memory>

+0

請發佈完整的錯誤消息,而不僅僅是第一行。 –

+0

還有一個更完整的實例,它不能編譯。你在這裏編譯得很好,在VS 2017中。 –

+0

'std :: make_shared'作爲一個參數引用一個對象,但是你使用'new'來創建一個指針,因此,可能你的''不能將參數1從'Stack :: Node *'爲'const Stack :: Node&'錯誤。 –

回答

3

std::shared_ptr<T>的構造函數接受用new創建的指針T

功能std::make_shared<T>(args...)代替你做new。您傳遞給make_shared的參數將傳遞給構造函數T。所以你應該幾乎不會傳遞它由new創建的指針(除非你真的想要new a T,然後將該指針作爲參數傳遞以創建另一個T!)。

因此,例如,而不是:

std::make_shared<typename A<T>::Node>(
    new typename A<T>::Node(item, top)) 

只做:

std::make_shared<typename A<T>::Node>(item, top) 

(順便說一句,你實際上並不需要那些最預選賽typename A<T>::只是普通Node是範圍,只要你在A<T>A<T>::Node的範圍內,無論是在該類的類定義和成員定義中的成員名稱。A<T>::Node沒有typename也會在這些情況下工作,因爲「當前實例化的成員」規則。)