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