문제

 // In A.h
 class A
 {
  public:
    enum eMyEnum{ eOne, eTwo, eThree };
  public:
    A(eMyEnum e);
 }

 // In B.h
 #include "A.h"
 class B
 {
    B();
    private:
       A memberA;
 }

 // In B.cpp
#include "B.h"
 B::B(void) : memberA(A::eOne)
 {}

g++ 컴파일러를 사용하면 'memberA'에 대한 선언으로 인해 컴파일 오류가 발생합니다.오류:'A::eOne'은 유형이 아닙니다.

어떻게 해야 이 문제를 극복할 수 있나요?매개 변수를 사용하지 않는 기본 생성자를 만들어야 합니까?

도움이 되었습니까?

해결책

멤버 변수를 초기화하려고하는 것과 같습니다.당신은 다음과 같은 일을 할 수 있습니다 :

class B
{
public:
    B() : memberA(A::eOne) {}  // Initializer list in constructor
private:
    A memberA;
};
.

다른 팁

A 생성자는 eMyEnum.왜 당신이 원하는지 명확하지 않습니다 B의 생성자는 eMyEnum 매개변수도요.그래도, 가정 당신의 목표는 인수를 전달하는 것입니다 A의 생성자는 다음과 같습니다. A::eOne (반대로 A::eMyEnum::eOne), 다음 코드를 사용해 볼 수 있습니다. typedef.

#include <iostream>
using namespace std;

class A {
public:
    typedef enum { eOne, eTwo, eThree } eMyEnum;
public:
    A(eMyEnum e) {
        cout << "A ctor" << endl;
    }
};

class B {
public:
    B() : memberA(A::eOne) {
        cout << "B ctor" << endl;
    }
private:
    A memberA;    

};

int main() {
    B b;
}

// output
A ctor
B ctor

그러나 memberA의 생성자는 항상 다음과 같은 인수로 호출됩니다. A::eOne.이 인수가 생성자에서 어떻게 사용되는지 보여주지 않았지만 실제 코드에서는 이 인수가 다음 멤버를 초기화한다고 가정합니다. A.멤버가 항상 같은 값을 가져야 한다면 const 생성자에서 매개변수를 제거합니다.

class B
{
    public:
    B(A::eMyEnum someValue = A::eOne) : memberA(someValue) {};

    private:   
    A memberA;
}
.

Eone은 유형이 아닙니다, Emyenum은 유형입니다.본질적으로 당신이 말하는 것은 "당신은이 방법으로 리터럴 2를 전달해야한다는 것입니다."그것은 어떤 의미가 있지 않습니다.열거 형을 지나갈 것인지 아니면 당신이가는 것을 명확히해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top