2013-10-24 4 views
2

약간의 데이터 유형을 구축하기 시작했습니다. 현재 단계에서는 부스트 변형에서 단 하나의 재귀 유형 만 있습니다. 내 유형을 인스턴스화하려고하면 세그 폴트가 발생합니다. 재귀 적 유형 앞에 문자열을두면 작동하지 않고 유형 뒤에 넣습니다. gcc 4.8.1 64 비트 및 1.54 향상 mingw 사용하고 있습니다.Segfault with boost variant

부스트 변형을 잘못 사용하고 있습니까? - recursive_wrapper<A>입니다 - 기본 C의 기본 생성자는 첫 번째 템플릿 매개 변수의 기본 건설 한 값 자체를 초기화해야합니다 :

#include <boost/variant.hpp> 
#include <boost/variant/recursive_variant.hpp> 

#include <string> 
#include <iostream> 

struct A; 
struct B; 

using C = boost::variant<boost::recursive_wrapper<A>>; 

// works: 
// using C = boost::variant<std::string, boost::recursive_wrapper<A>>; 

struct A { 
    std::string name; 
    C variant; 
}; 

struct B { 
    std::string name; 
    C variant; 
}; 

int main() { 

    std::cout << "start" << std::endl; 
    B hAST; // <--- segfaults 
    std::cout << "end" << std::endl; 

    return 0; 
} 
+1

스택 오버플로 :-)가 무엇입니까? –

답변

3

나는이 variant의 "결코 비어"보증 때문이라고 생각 recursive_wrapper<A>의 생성자는 기본값으로 구성된 A 인스턴스로 초기화해야하므로 무한 재귀가 발생합니다.

실제로 빈, 또는 A의 인스턴스 중 하나 인 variant을 원하는 가정하면, 예를 들어, 변형의 첫 번째 매개 변수로 더미 유형을 소개 할 수 :

struct variant_is_empty { }; 

using C = boost::variant<variant_is_empty, boost::recursive_wrapper<A>>; 

편집 : It appears you can use boost::recursive_wrapper with boost::optional,을하는 위의 선택적, 재귀 유형의 경우에 variant을 사용하는 것보다 쉽습니다.

+0

고맙습니다. –