我有一个成员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。)
这里的交易是什么?
答案 0 :(得分:3)
问题在于:
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> {
如Angew所述,您需要公开继承enable_shared_from_this
。