У меня есть вариант наддува с 7 типами. Когда я пытаюсь использовать последние два типа, компоновщик segfaults. Я использую g ++ (gcc версии 3.3.3 для SuSE Linux) на 64-битной машине Linux, и я получаю ошибку
collect2: ld terminated with signal 11 [Segmentation fault]
Неважно, в каком порядке я помещаю типы, последние два вызовут ошибку сегмента, когда я попытаюсь использовать их. Есть идеи, почему это будет происходить?
Код:
typedef boost::tuple<std::string, Class1::Ptr> Class1Tuple;
typedef boost::tuple<std::string, Class2::Ptr> Class2Tuple;
typedef boost::tuple<std::string, Class3::Ptr> Class3Tuple;
typedef boost::tuple<std::string, Class4::Ptr> Class4Tuple;
typedef boost::tuple<std::string, Class5::Ptr> Class5Tuple;
typedef boost::tuple<std::string, Class6::Ptr> Class6Tuple;
typedef boost::tuple<std::string, Class7::Ptr> Class7Tuple;
typedef boost::variant< Class1Tuple, Class2Tuple, Class3Tuple,
Class4Tuple, Class5Tuple, Class6Tuple,
Class7Tuple > ClassTupleItem;
ClassX :: Ptr - это расширенный общий указатель на этот класс. Ptr определяется как typedef внутри самого класса, как показано ниже
struct Class1
{
typedef boost::shared_ptr<Class1> Ptr;
...
...
}
когда я пытаюсь использовать последние два типа в варианте буста, как в
Class1Tuple tup("str", pointer);
ClassTupleItem(tup); // works fine since I used Class1Tuple
Class6Tuple tup2("str", pointer2);
ClassTupleItem(tup2); // causes a segfault.
если я определю boost :: variable как (поменять местами Class6 и Class1)
typedef boost::variant< Class6Tuple, Class2Tuple, Class3Tuple,
Class4Tuple, Class5Tuple, Class1Tuple,
Class7Tuple > ClassTupleItem;
тогда я получаю segfault при компиляции этого кода
Class1Tuple tup("str", pointer);
ClassTupleItem(tup); // worked earlier