Использование указателя на тип неполного класса не допускается, как быть?

Возможно, это не решается, но что если да?

Код в общих чертах:

#include<iostream>
#include<vector>

class Base
{
public:
    virtual void f() = 0;
};

class A
    : public Base
{
public:
    void f() override 
    { 
        std::cout << "A";
    };
};

class B
    : public Base
{
public:
    void f() override
    { 
       std::cout << "B";
    };
};

int main()
{
    std::vector<Base*> v;

    v.push_back(new A());
    v.push_back(new B());

    for (auto& m : v)
    {
        m->f();   // Вот тут VS2019 ругается на неполный тип
    }
    return 0;
}

Есть ли какой-то рабочий аналог такого способа? Мне надо получить доступ к объектам ПОЛНЫХ КЛАССОВ, которые являются наследниками базового ВИРТУАЛЬНОГО класса

UPD: исправил глупости, написанные второпях


Ответы (3 шт):

Автор решения: Zhihar

Сделайте базовый класс абстрактным

class Base
{
public:
    virtual void f() = 0;
};

class A
    : public Base
{
public:
    void f() { std::cout << "A" << std::endl; }
};

class B
    : public Base
{
public:
    void f() { std::cout << "B" << std::endl; }
};

int main(int argc, const char * argv[])
{
    std::vector<Base*> v;

    v.push_back(new A());
    v.push_back(new B());

    for (auto& m : v)
    {
        m->f();   // Вот тут VS2019 ругается на неполный тип
    }

    _getch();
}

а можно и не делать:

class Base
{
public:
    virtual void f() { std::cout << "Base" << std::endl; };
};

class A
    : public Base
{
public:
    void f() { std::cout << "A" << std::endl; }
};

class B
    : public Base
{
public:
    void f() { std::cout << "B" << std::endl; }
};

тоже будет работать

честно говоря вообще странно как ваш код пытался компилироваться - в нем куча ошибок было - подчистил код и все заработало (см. выше 2 способа)

→ Ссылка
Автор решения: Harry

Напишите for (auto m : v) и не мучайтесь... Вам же не нужна ссылка на указатель. А если нужна ссылка, то пишите правильно:

for (auto& m : v)

Обратите внимание на местоположение &

Не абстрактность класса выползет только при линковке, она к самой компиляции в полной мере ни при чем. Вот скрины для тех, кто считает, что проблема в не абстрактности Base:

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка
Автор решения: Kirill

Проблема оказалась до очевидного проста. На самом деле, в том примере, что у меня сейчас не должно быть ошибок - ошибка была В ДРУГОМ ОБЪЕКТЕ, хотя красной волнистой линией подчёркивался именно этот объект.введите сюда описание изображения

→ Ссылка