简体   繁体   中英

member object constructor and enum

Why does this not compile?

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 says: error C2061: syntax error: identifier 'EN_TEST'

armcc compiler says: error: #757: constant "CTest::EN_TEST" is not a type name

Thanks, Mirco

You cannot initialize like that. In-class initialization can be done for only static const integral type.

Use initialization-list in the constructor, as:

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

Because,

CTest obj_Test(CTest::EN_TEST);

is evaluated as a function named obj_Test . Now it should have argument as a type, however, CTest::EN_TEST is a value, not a type .

If it's intended that obj_Test an object then you have pass CTest::EN_TEST to it in the constructor:

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

Because your syntax for CAnotherTest is wrong. Perhaps you mean something like this?

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

    // Member variable
    CTest obj_Test;
};

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM