【问题标题】:No matching constructor for initialisation of const std::shared_ptr<>const std::shared_ptr<> 的初始化没有匹配的构造函数
【发布时间】:2018-10-21 12:40:30
【问题描述】:

场景
我在 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&lt;SomeClass&gt; &amp; 类型引入其构造函数并将其存储为其成员。

接下来是ClassB,它具有ClassA 的私有成员std::shared_ptr。我想要做的就是初始化m_class_a,将const std::shared_ptr&lt;SomeClass&gt; &amp; 传递给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

ma​​in.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&lt;ClassA&gt; m_class_a 作为成员,我将拥有ClassA &amp; m_class_a 作为成员会有什么变化?

【问题讨论】:

  • 编译器错误信息有什么不清楚的地方?
  • 好吧。我将const std::shared_ptr&lt;SomeClass&gt; &amp; 传递到另一个也接受const std::shared_ptr&lt;SomeClass&gt; &amp; 的结构中。两者都是同一类型。为什么编译器会抱怨?我不明白。我不是说编译器错了,而是想知道原因。
  • 根据需要提供minimal reproducible example,也许有人可以给你一个简洁的答案。
  • SomeClass 构造函数是什么样的? someclass 在将其作为对共享指针的引用传递给 classA 之前的初始化位在哪里。
  • 请注意 m_class_a 需要 const std::shared_ptr&lt;SomeClass&gt; &amp; 来初始化自己。 const std::shared_ptr&lt;SomeClass&gt; &amp; 只是从 ClassA 传播到 ClassB。这就是逻辑/目标。

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


【解决方案1】:

您的问题是您尝试初始化类型为std::shared_ptr&lt;ClassA&gt; 的变量,但您给它的是std::shared_ptr&lt;SomeClass&gt;。它们不兼容。

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

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

【讨论】:

  • std::make_shared(some_class) 这是正确的吗?我不这么认为
  • 请注意 m_class_a 需要 const std::shared_ptr&lt;SomeClass&gt; &amp; 来初始化自己。 const std::shared_ptr&lt;SomeClass&gt; &amp; 只是从 ClassA 传播到 ClassB。这就是逻辑/目标。
  • 正如我所说,我正在创建一个新的ClassA,因为只有一个新的ClassA 才能使用SomeClass。否则这个共享指针会去哪里?所以我创建了一个新的ClassA,然后它通过其构造函数传播SomeClass 共享指针。
  • 请正确回答。它应该是 std::make_shared&lt;ClassA&gt;(some_class) 而不是 std::make_shared(some_class)
  • 确实如此。明显漏掉了类型!
猜你喜欢
  • 2016-11-06
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 2017-06-27
相关资源
最近更新 更多