std::enable_shared_from_this:没有已知的从 a 到 a 的转换
std::enable_shared_from_this: no known conversion from a to a
我有一个 class VectorSpace
和一个成员 createVector()
,它创建了一个 Vector
和一个指向引用 VectorSpace
的共享指针。这是通过 std::enable_shared_from_this
.
实现的
然而,下面这段代码
#include <memory>
class Vector;
class VectorSpace;
class Vector {
public:
Vector(std::shared_ptr<VectorSpace> & space):
space_(space)
{
};
private:
std::shared_ptr<VectorSpace> space_;
};
class VectorSpace: std::enable_shared_from_this<VectorSpace> {
public:
VectorSpace(){};
Vector
createMember()
{
return Vector(shared_from_this());
};
};
int main() {
auto space = std::make_shared<VectorSpace>();
Vector x(space);
}
失败 编译并出现非常奇怪的错误消息
test.cpp:8:3: note: no known conversion for argument 1 from ‘std::shared_ptr<VectorSpace>’ to ‘std::shared_ptr<VectorSpace>’
(这是 GCC 4.9.2。)
这是怎么回事?
问题在这里:
Vector(std::shared_ptr<VectorSpace> & space):
^^^
Vector
构造函数采用左值引用,但在 createMember()
中您传递的是右值:
Vector
createMember()
{
return Vector(shared_from_this());
};
只需放下 &
。对于它的价值,我无法访问 gcc 4.9.2,但至少在 5.1.0 上错误消息非常清楚:
main.cpp: In member function 'Vector VectorSpace::createMember()':
main.cpp:24:35: error: invalid initialization of non-const reference of type 'std::shared_ptr<VectorSpace>&' from an rvalue of type 'std::shared_ptr<VectorSpace>'
return Vector(shared_from_this());
^
您的代码中的第二个问题是:
class VectorSpace: std::enable_shared_from_this<VectorSpace> {
正如 指出的那样,您需要公开继承 enable_shared_from_this
。
我有一个 class VectorSpace
和一个成员 createVector()
,它创建了一个 Vector
和一个指向引用 VectorSpace
的共享指针。这是通过 std::enable_shared_from_this
.
然而,下面这段代码
#include <memory>
class Vector;
class VectorSpace;
class Vector {
public:
Vector(std::shared_ptr<VectorSpace> & space):
space_(space)
{
};
private:
std::shared_ptr<VectorSpace> space_;
};
class VectorSpace: std::enable_shared_from_this<VectorSpace> {
public:
VectorSpace(){};
Vector
createMember()
{
return Vector(shared_from_this());
};
};
int main() {
auto space = std::make_shared<VectorSpace>();
Vector x(space);
}
失败 编译并出现非常奇怪的错误消息
test.cpp:8:3: note: no known conversion for argument 1 from ‘std::shared_ptr<VectorSpace>’ to ‘std::shared_ptr<VectorSpace>’
(这是 GCC 4.9.2。)
这是怎么回事?
问题在这里:
Vector(std::shared_ptr<VectorSpace> & space):
^^^
Vector
构造函数采用左值引用,但在 createMember()
中您传递的是右值:
Vector
createMember()
{
return Vector(shared_from_this());
};
只需放下 &
。对于它的价值,我无法访问 gcc 4.9.2,但至少在 5.1.0 上错误消息非常清楚:
main.cpp: In member function 'Vector VectorSpace::createMember()':
main.cpp:24:35: error: invalid initialization of non-const reference of type 'std::shared_ptr<VectorSpace>&' from an rvalue of type 'std::shared_ptr<VectorSpace>'
return Vector(shared_from_this());
^
您的代码中的第二个问题是:
class VectorSpace: std::enable_shared_from_this<VectorSpace> {
正如 enable_shared_from_this
。