использование неопределенного типа в прямом объявлении

0

Привет, у меня есть следующее:

class A; // forward declaration of class A
void A::foo(int, int); // forward declaration of member function foo of A

class Functor
{
public:
    Functor(const A* in_a):m_a(in_a){}
    virtual ~Functor(){m_a= 0;};

    virtual void Do(int,int) = 0;

protected:
    const A* m_a;
};

class FunctorDerived: public Functor
{
    FunctorDerived(const A* in_a):Functor(in_a){}

    void Do(int in_source, int in_target)
    {
        m_a->foo(in_source, in_target);
    }
};


class A
{
    ....
    void foo(int, int);
    ....
}

Когда компилятор компилятора говорит:

error C2027: use of undefined type 'A'
see declaration of 'A'

Кажется, что A не распознается компилятором, хотя я просил его объявить, а также переслать объявленную функцию-член, которую мне нужно использовать (A :: foo).

Я точно знаю, что все написано в одном файле.

Не могли бы вы помочь мне понять, что я сделал неправильно?

Спасибо за помощь

Натаниель

Теги:
types
use

2 ответа

1

Переместите определение A сверху. Тогда, если вам нужно реализовать foo:

class A
{
    void foo(int, int);
}

class Functor
{
public:
    Functor(const A* in_a):m_a(in_a){}
    virtual ~Functor(){m_a= 0;};

    virtual void Do(int,int) = 0;

protected:
    const A* m_a;
};

class FunctorDerived: public Functor
{
    FunctorDerived(const A* in_a):Functor(in_a){}

    void Do(int in_source, int in_target)
    {
        m_a->foo(in_source, in_target);
    }
};

void A::foo(int x, int y)
{
    //do smth
}
0

m_a-> - вы разыменовываете A*. На этом этапе компилятору необходимо полное определение A

Короче говоря, форвардная декларация не будет работать. Обеспечьте полный тип.

  • 0
    нет. Это просто обычный C, вы можете вызывать функцию, предоставляя только предварительное объявление ... этого достаточно для компилятора, определение необходимо во время ссылки
  • 0
    нет, это C ++, это функция-член.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню