没有匹配的构造函数来初始化 const std::shared_ptr<>
No matching constructor for initialisation of const std::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) {
}
注意上面 ClassA
将 const std::shared_ptr<SomeClass> &
类型引入其构造函数并将其存储为其成员。
接下来是 ClassB
,它有 ClassA
的私有成员 std::shared_ptr
。我想要做的就是通过传递 const std::shared_ptr<SomeClass> &
来初始化 m_class_a
,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
作为成员,会有什么变化?
您的问题是您试图初始化类型为 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))
{}
场景
我在 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
。我想要做的就是通过传递 const std::shared_ptr<SomeClass> &
来初始化 m_class_a
,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
作为成员,会有什么变化?
您的问题是您试图初始化类型为 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))
{}