2014-02-23 3 views
5

Visual Studio에서 간단한 조합을 처리 할 수있는 방법이 있습니까? 다음 코드는 g++ -std=c++11를 사용하여 잘 실행되지만 VS 불평 :조합 멤버가 잘못되었습니다.

유효하지 않은 조합원 - 클래스 "푸"는 다음과 같이

코드가 허용되지 않는 멤버 함수를 가지고 :

struct Foo { 
    int value; 
    Foo(int inV = 0) : value(inV) {} 
}; 

union CustomUnion { 
    CustomUnion(Foo inF) : foo(inF) {} 
    CustomUnion(int inB) : bar(inB) {} 
    int bar; 
    Foo foo; 
}; 

int main() { 
    CustomUnion u(3); 
    return 0; 
} 

Visual Studio에서 이러한 종류의 조합 (예 : 컴파일 옵션)을 지원하는 방법이 있습니까? 아니면 내 코드를 변경해야합니까? 그렇다면 무엇을 변경해야합니까? MSDN에 기재된 바와 같이

+1

빠른 연구에서 발견 한이 주제에 대한 유일한 정보는 [Bjarne Stroustrup의 C++ FAQ, 노동 조합 (일반)] (http://www.stroustrup.com/C++11FAQ.html#unions)에 있습니다. 희망이 당신을 더욱 도움이됩니다. –

답변

1

가 연합 막 부재 액세스 : 모든 생성자 또는 소멸자없이 1) 클래스 타입, 2) 고정 부재, 사용자 정의 할당 작업 (대체없이 3) 클래스 타입 =). 당신이 하나를 정의하기 때문에 귀하의 경우 에, 노조가 비 POD 유형을 포함 할 수있는 C++ (11) 기능입니다

3

Visual Studio does not support unrestricted unions이 아닌 사소한 생성자가 있습니다.

Visual Studio에서 지원하는 참조가 표시되지 않으므로 Visual Studio에서와 같이 작동하지 않는 것처럼 보입니다. many who do want this feature supported이있는 것으로 보입니다.

내가 작동하는 것을 볼 수있는 유일한 방법은 Foo에서 사용자 정의 생성자를 제거하는 것입니다. 이는 CustomUinon 생성자에서 수동으로 foo을 초기화하는 것을 의미합니다.

좋은 참고 자료는 C++11 Standard Explained: 1. Unrestricted Union입니다.

+0

불행히도 Visual Studio에서 처리 할 수있는 방법이 없다는 것을 확인하는 것 같습니다 ... 확인해 주셔서 감사합니다. – bagage

7

@Shafik Yaghmour에 동의하지만 쉽게 해결할 수 있습니다.

union CustomUnion { 
    struct{ 
     Foo foo; 
    }; 
    int bar; 
}; 
0

나는이 같은 오류가 발생했지만, 내 상황이 다를 수 있습니다 :
그냥 그렇게 같은 unnamed structfoo 회원을 넣어. 노조가 기본 생성자를 찾고 있음이 나타납니다.

struct Foo 
{ 
    union 
    { 
     Bar bar; // intellisense will still show error, but you can ignore it. 
    }; 
}; 

그리고 당신 내 바 클래스을 대신 기존의 기본 생성자 Bar();를 만들고 그것을 정의하는, Bar() = default;로 변경하고 기본 생성자를 삭제 :

그래서 내 수업에서 나는이 작업을 수행했다 .cpp 파일에서 인텔리 센스 (Intellisense)가 무슨 일이 일어나고 있는지 정확히 알지 못하기 때문에 막대 막대에 대한 오류가 계속 표시됩니다. 이 도움이된다면 응용 프로그램은 여전히 ​​컴파일됩니다.