Перекрестные ссылки, предварительные декларации и т. Д. В каком порядке?

Позволять:

class A
{
    typedef A (* func_t)( A a );

    func_t * _func;
};

В каком порядке я должен написать это, и какое предварительное объявление мне нужно (если оно есть), чтобы оно компилировалось?

Это мой настоящий код, если нужно:

class Value
{
public:

   typedef Value (* func_t)( const std::vector< Value > & args );

private:

   union
   {
      /// ...

      func_t * _f;
   }
   _data;

   // ...
};

Value Value::operator () ( const std::vector< Value > & args ) const
{
   if( this->isFunction() )
   {
      return this->_data._f( args ); // ERROR
   }
   else
   {
      throw exception( "Value::operator () - Not an E_FUNCTION." );
   }
}

Что дает мне ошибку:

error C2064: term does not evaluate to a function taking 1 arguments

Спасибо за вашу помощь:)

РЕДАКТИРОВАТЬ: Я также пытался объявить тип указателя функции до, после и внутри класса, но всегда есть проблема.

1 ответ

Решение

Заказ выглядит хорошо. Что не выглядит нормально

func_t * _f;

Вы объявляете указатель на указатель на член, а затем пытаетесь использовать его в качестве указателя на член. Вместо этого используйте обычный указатель на член:

func_t _f;
Другие вопросы по тегам