конструктор объекта-члена и перечисление - PullRequest
1 голос
/ 14 июля 2011

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

File.hpp

class CTest
{
  public:
    enum enumTest { EN_TEST };

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

AnotherFile.hpp

#include "File.hpp"

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

Visual Studio сообщает: ошибка C2061: синтаксическая ошибка: идентификатор 'EN_TEST'

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

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

Ответы [ 3 ]

3 голосов
/ 14 июля 2011

Потому что,

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) {}
};
3 голосов
/ 14 июля 2011

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

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

    // Member variable
    CTest obj_Test;
};
3 голосов
/ 14 июля 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...