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

No matching constructor for initialisation of const std::shared_ptr<>

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

首先,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。我想要做的就是通过传递 const std::shared_ptr<SomeClass> & 来初始化 m_class_aClassA 需要初始化它的成员。

ClassB.h

ClassB {

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

private:
    std::shared_ptr<ClassA> m_class_a;
}

ClassB.cpp

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>`"

最后,这是我的 main.cpp,它只想初始化 ClassB

main.cpp

int main(int argc, char *argv[])

    auto some_cass = std::make_shared<SomeClass>();
    ClassB object_b(some_class);
    return 0;
}

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

第二个问题:
如果在 ClassB 中,而不是让 std::shared_ptr<ClassA> m_class_a 作为成员,我会有 ClassA & m_class_a 作为成员,会有什么变化?

您的问题是您试图初始化类型为 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))
{}