1

我正在使用 astd::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 'Stack::Node::Node(const Stack::Node &)':无法将参数 1 从 'Stack::Node *' 转换为 'const Stack::Node &' 内存901

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

4

1 回答 1

5

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

std::make_shared<T>(args...)该功能new代替您。您传递给的参数make_shared将传递给T. 因此,您几乎不应该将由创建的指针传递给它new(除非您真的想要newa 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>::限定符。只要您在orNode的范围内,无论是在成员名称之后的类定义和该类的成员定义中,都在范围内。 没有will由于“当前实例化的成员”规则,也可以在这些上下文中工作。)A<T>A<T>::NodeA<T>::Nodetypename

于 2017-10-06T00:43:31.427 回答