没有用于初始化const std :: shared_ptr <>的匹配构造函数

时间:2018-10-21 12:40:31

标签: c++ c++17 shared-ptr

场景
我正在 MacOS 上使用 C ++ 17 clang 作为编译器。我有一些按照特定顺序初始化的类,如下面的示例代码所示

首先,SomeClass非常简单,在示例中,几乎是一个虚拟对象。

SomeClass.h

SomeClass {

public:
    SomeClass() { }
}

让我们说下面是ClassA

ClassA.h

ClassA {

public:
    ClassA(const std::shared_ptr<SomeClass> & some_class);

private:
    std::shared_ptr<SomeClass> m_some_class;
}

ClassA.cpp

ClassA::ClassA(const std::shared_ptr<SomeClass> & some_class) : m_some_class(some_class) {

}

请注意,ClassAconst std::shared_ptr<SomeClass> &类型引入其构造函数并将其存储为成员。

接下来是ClassB,其中ClassA的私有成员为std::shared_ptr。我要做的就是通过向m_class_a传递const std::shared_ptr<SomeClass> &来初始化其成员所需的ClassA来初始化ClassB { public: ClassB(const std::shared_ptr<SomeClass> & some_class); private: std::shared_ptr<ClassA> m_class_a; }

ClassB.h

ClassB::ClassB(const std::shared_ptr<SomeClass> & some_class) : m_class_a(some_class) {

}
// Above constructor throws compiler error complaining "No matching constructor for initialisation of `std::shared_ptr<SomeClass>`"

ClassB.cpp

main.cpp

最后,这是我的ClassB,只想初始化int main(int argc, char *argv[]) auto some_cass = std::make_shared<SomeClass>(); ClassB object_b(some_class); return 0; }

main.cpp

ClassB

问题:
我上面做的事情有什么问题,并且此编译器错误的原因是什么?我该如何解决该问题?

次要问题:
如果在std::shared_ptr<ClassA> m_class_a中使用ClassA & m_class_a作为成员,而不是将{{1}}作为成员,将会发生什么变化?

1 个答案:

答案 0 :(得分:2)

您的问题是,您正在尝试初始化类型为std::shared_ptr<ClassA>的变量,但是给了它一个std::shared_ptr<SomeClass>。它们不兼容。

您是否要创建新的ClassA?在这种情况下,构造函数应为:

ClassB::ClassB(const std::shared_ptr<SomeClass> & some_class)
: m_class_a(std::make_shared<ClassA>(some_class))
{}