成员对象构造函数和枚举

时间:2011-07-14 11:13:34

标签: c++ constructor

为什么不编译?

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”不是类型名称

谢谢,Mirco

3 个答案:

答案 0 :(得分:3)

你无法像这样初始化。可以仅对static const整数类型进行类内初始化。

在构造函数中使用initialization-list,如下:

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

答案 1 :(得分: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) {}
};

答案 2 :(得分:3)

因为CAnotherTest的语法错误。也许你的意思是这样的?

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

    // Member variable
    CTest obj_Test;
};