c ++ std :: shared_ptr错误C2664

时间:2017-10-06 00:30:40

标签: c++11 shared-ptr c2664

我使用std::shared_ptr指向节点

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&#39; Stack :: Node :: Node(const Stack :: Node&amp;)&#39;:无法转换参数1来自&#39; Stack :: Node *&#39; to&#39; const Stack :: Node&amp;&#39;记忆901

我需要更改哪些内容以符合<memory>

1 个答案:

答案 0 :(得分:4)

std::shared_ptr<T>的构造函数接受使用T创建的new指针。

函数std::make_shared<T>(args...)代替您new。传递给make_shared的参数将传递给T的构造函数。所以你几乎不应该传递new创建的指针(除非你真的想要new一个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>。 1}},在成员名称后的类定义和成员定义中都没有A<T>::Node,因为“当前实例化的成员”规则也可以在这些上下文中工作。 )