我使用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>
?
答案 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
,因为“当前实例化的成员”规则也可以在这些上下文中工作。 )