J'ai une variante boost avec 7 types. Lorsque j'essaie d'utiliser les deux derniers types, les segings de l'éditeur de liens. J'utilise g ++ (version gcc 3.3.3 sur SuSE Linux) sur une machine Linux 64 bits et l'erreur que je reçois estProblème avec boost :: variant, linker donnant une erreur de segmentation
collect2: ld terminated with signal 11 [Segmentation fault]
Il n'a pas d'importance quel ordre je mets les types dans, les deux derniers causeront un segfault quand j'essaie de les utiliser. Des idées pourquoi cela se passerait-il?
code:
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 est un coup de pouce pointeur partagé à cette classe. PTR est défini comme un typedef dans la classe elle-même comme ci-dessous
struct Class1
{
typedef boost::shared_ptr<Class1> Ptr;
...
...
}
lorsque je tente d'utiliser les deux derniers types dans la variante de boost comme dans
Class1Tuple tup("str", pointer);
ClassTupleItem(tup); // works fine since I used Class1Tuple
Class6Tuple tup2("str", pointer2);
ClassTupleItem(tup2); // causes a segfault.
si je définis le boost :: Variant (échange Class6 et Class1)
typedef boost::variant< Class6Tuple, Class2Tuple, Class3Tuple,
Class4Tuple, Class5Tuple, Class1Tuple,
Class7Tuple > ClassTupleItem;
puis je reçois une erreur de segmentation lors de la compilation de ce code
Class1Tuple tup("str", pointer);
ClassTupleItem(tup); // worked earlier
Code postal s'il vous plaît. Ce n'est pas assez d'informations pour diagnostiquer le problème. –
Le message d'erreur réel serait également utile –
Si je devais deviner, peut-être le nom mutilé est débordement interne tamponne l'éditeur de liens et le compilateur. Si vos typedefs sont eux-mêmes à l'intérieur d'un espace de noms, essayez de les retirer et de voir si le problème disparaît. Néanmoins, un segfault est n'importe quel bogue de compilateur ou d'éditeur de liens, et vous devriez les soumettre au bugzilla de GCC avec un cas de test simple. –