boost :: variant的问题,链接器给出了段错误

时间:2010-02-23 14:32:50

标签: c++ g++ segmentation-fault boost-variant

我有一个包含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

1 个答案:

答案 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.

如果类是这样声明的,对于Class1Tuplepointer应该是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;
    /* ... */
};