конструктор объекта-члена и перечисление

Почему это не компилируется?

Файл.hpp

class CTest
{
  public:
    enum enumTest { EN_TEST };

    //constructor:
    CTest(enumTest f_en);
};

Другой файл.hpp

#include "File.hpp"

class CAnotherTest
{
  public:
    CTest obj_Test(CTest::EN_TEST);
};

Visual Studio говорит: ошибка C2061: синтаксическая ошибка: идентификатор «EN_TEST»

Компилятор armcc говорит: ошибка: #757: константа "CTest::EN_TEST" не является именем типа

Спасибо, Мирко


person Mirco    schedule 14.07.2011    source источник


Ответы (3)


Потому что,

CTest obj_Test(CTest::EN_TEST);

оценивается как функция с именем obj_Test. Теперь у него должен быть аргумент как тип, однако CTest::EN_TEST является значением, а не типом.

Если предполагается, что obj_Test объект, вам нужно передать CTest::EN_TEST ему в конструкторе:

class CAnotherTest
{
public:
  CAnotherTest () : obj_Test(CTest::EN_TEST) {}
};
person iammilind    schedule 14.07.2011

Потому что ваш синтаксис для CAnotherTest неверен. Возможно, вы имеете в виду что-то вроде этого?

class CAnotherTest
{
  public:
    // Constructor     vvv Initialise member variable
    CAnotherTest() : obj_Test(CTest::EN_TEST) {}

    // Member variable
    CTest obj_Test;
};
person Oliver Charlesworth    schedule 14.07.2011

Вы не можете инициализировать так. Инициализация в классе может быть выполнена только для целочисленного типа static const.

Используйте список инициализации в конструкторе, как:

class CAnotherTest
{
  public:

    CTest obj_Test; //member declaration. no initialization here

    static const int value  = 100; //OK. static const integral type!

    CAnotherTest() : obj_Test(CTest::EN_TEST) {}
                 //^^^^^^^^^^^^^^^^^^^^^^^^^^ its called initialization-list
};

const int CAnotherTest::value; //definition goes to .cpp file
person Nawaz    schedule 14.07.2011