我有一个包含7种类型的提升变体。当我尝试使用最后两种类型时,链接器会出现段错误。我在64位Linux机器上使用g ++(SuSE Linux上的gcc版本3.3.3),我得到的错误是
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是该类的boost共享指针。 Ptr被定义为类本身内的typedef,如下所示
struct Class1
{
typedef boost::shared_ptr<Class1> Ptr;
...
...
}
当我尝试使用boost变体中的最后两种类型时,如
Class1Tuple tup("str", pointer);
ClassTupleItem(tup); // works fine since I used Class1Tuple
Class6Tuple tup2("str", pointer2);
ClassTupleItem(tup2); // causes a segfault.
如果我将boost :: variant定义为(交换Class6和Class1)
typedef boost::variant< Class6Tuple, Class2Tuple, Class3Tuple,
Class4Tuple, Class5Tuple, Class1Tuple,
Class7Tuple > ClassTupleItem;
然后在编译此代码时出现段错误
Class1Tuple tup("str", pointer);
ClassTupleItem(tup); // worked earlier
答案 0 :(得分:1)
它看起来像编译器/链接器错误:没有C ++代码应该在编译器/链接器中引起段错误。
顺便问一下,如何编译这段代码? pointer
如何宣布?
Class1Tuple tup("str", pointer);
ClassTupleItem(tup); // works fine since I used Class1Tuple
Class6Tuple tup2("str", pointer);
ClassTupleItem(tup2); // causes a segfault.
如果类是这样声明的,对于Class1Tuple
,pointer
应该是shared_ptr<Class1>
,对于Class6Tuple
,它应该是不同的类型,{{1 }}
shared_ptr<Class6>
编辑:以下代码使用g ++ 3.3.6正确编译。我目前无法在gcc 3.3.3和SUSE Linux上测试它。请尝试编译它,看看链接器是否仍然提供了段错误。
struct Class1
{
typedef boost::shared_ptr<Class1> Ptr;
/* ... */
};
/* ... */
struct Class6
{
typedef boost::shared_ptr<Class6> Ptr;
/* ... */
};