【发布时间】:2018-10-21 12:40:30
【问题描述】:
场景
我在 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) {
}
请注意,ClassA 将 const std::shared_ptr<SomeClass> & 类型引入其构造函数并将其存储为其成员。
接下来是ClassB,它具有ClassA 的私有成员std::shared_ptr。我想要做的就是初始化m_class_a,将const std::shared_ptr<SomeClass> & 传递给ClassA 需要初始化它的成员。
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 作为成员会有什么变化?
【问题讨论】:
-
编译器错误信息有什么不清楚的地方?
-
好吧。我将
const std::shared_ptr<SomeClass> &传递到另一个也接受const std::shared_ptr<SomeClass> &的结构中。两者都是同一类型。为什么编译器会抱怨?我不明白。我不是说编译器错了,而是想知道原因。 -
根据需要提供minimal reproducible example,也许有人可以给你一个简洁的答案。
-
SomeClass构造函数是什么样的?someclass在将其作为对共享指针的引用传递给 classA 之前的初始化位在哪里。 -
请注意
m_class_a需要const std::shared_ptr<SomeClass> &来初始化自己。const std::shared_ptr<SomeClass> &只是从ClassA传播到ClassB。这就是逻辑/目标。
标签: c++ c++17 shared-ptr