Как объявить общий указатель в списке инициализации члена - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь добавить общий указатель в мой список инициализации. Этот указатель уже был объявлен в моем заголовочном файле. Как только я добавляю его в список, компилятор выдает ошибку с error: no matching function for call to std::shared_ptr<memory::Mmu>::shared_ptr(std::shared_ptr<Cartridge>&)

заголовочным файлом:

class Gameboy {
    public:
        Gameboy(std::vector<uint8_t>);
        void run();
    private:
        void tick();
        std::shared_ptr<Cartridge> cartridge;
        std::shared_ptr<memory::Mmu> mmu;
};

c файлом:

Gameboy::Gameboy(std::vector<uint8_t> cartridgeData)
    : cartridge(getCartridge(std::move(cartridgeData))),
      mmu(cartridge)
    {

    }

mmu.h


namespace memory {
    class Mmu {
        public:
            std::shared_ptr<Cartridge> cartridge;
            Mmu(std::shared_ptr<Cartridge>&);

        private:
            bool bootRomActive() const;
    };
}

Я ожидаю, что он вызовет конструктор mmu, который принимает std::shared_ptr<Cartridge>& в качестве первого параметра.

1 Ответ

0 голосов
/ 31 октября 2019

std::shared_ptr<T> не имеет конструктора, который принимает std::shared_ptr<Y>, когда Y не является производным от T.

Предполагая, что ваш Cartridge не является производным от memory::Mmu (вы сделалине показывать объявление Cartridge), тогда вы не можете создать std::shared_ptr<memory::Mmu> непосредственно из std::shared_ptr<Cartridge>. Отсюда и сообщение об ошибке.

Если вам нужно создать новый memory::Mm, который ссылается на Cartridge, то в списке инициализации Gameboy члена измените это:

mmu(cartridge)

Или:

mmu(new memory::Mm(cartridge))

Или:

mmu(std::make_shared<memory::Mm>(cartridge))
...