std :: enable_shared_from_this:没有从a到a的已知转换

时间:2015-06-09 12:39:19

标签: c++ c++11 this shared-ptr

我有一个成员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。)

这里的交易是什么?

1 个答案:

答案 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