Mus*_*shy 1 shared-ptr c2664 c++11
我正在使用 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));
}
}
Run Code Online (Sandbox Code Playgroud)
结果声明和定义导致编译器错误
严重性代码说明项目文件行抑制状态错误 C2664“Stack::Node::Node(const Stack::Node &)”:无法将参数 1 从“Stack::Node *”转换为“const Stack::Node &”内存901
我需要改变什么才能符合<memory>?
的构造函数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))
Run Code Online (Sandbox Code Playgroud)
只做:
std::make_shared<typename A<T>::Node>(item, top)
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,您实际上并不需要大多数这些typename A<T>::限定符。Node只要您处于A<T>or的范围内A<T>::Node,无论是在类定义还是在成员名称之后的该类的成员定义中,就都在范围内。 A<T>::Node没有typename将由于“当前实例化的成员”规则,也可以在这些上下文中工作。)
| 归档时间: |
|
| 查看次数: |
3062 次 |
| 最近记录: |