2015-06-09 21 views
0

我有一个类VectorSpace与成员createVector()它创建一个带有指向VectorSpace的共享指针的Vector。这通过std::enable_shared_from_this来实现。std :: enable_shared_from_this:没有已知的从a到a的转换

然而,这下面的代码

#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。)

编译这里的交易是什么?

+2

尝试删除&在向量构造函数:shared_from_this创建新的shared_ptr – Hcorg

+0

@Hcorg刚刚注意到您的评论。你可能会考虑让这类事情成为答案 - 它解决了这个问题。 –

+1

我可以告诉你编辑了错误信息,因为你没有显示错误。您仅在错误中复制** note **。请不要隐藏错误消息。他们不应该是秘密! – Yakk

回答

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

+0

现在它说:'错误:'std :: enable_shared_from_this '是一个'VectorSpace''的人迹罕至的基地。这对GCC 5.1有什么不同? –

+4

@NicoSchlömer您需要为'enable_shared_from_this'使用公共继承。 – Angew