Нет подходящего конструктора для инициализации const std :: shared_ptr <> - PullRequest
0 голосов
/ 21 октября 2018

Сценарий
Я использую C ++ 17 на MacOS с 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как участник?

1 Ответ

0 голосов
/ 21 октября 2018

Ваша проблема в том, что вы пытаетесь инициализировать переменную с типом 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))
{}
...