2010-02-23 41 views
2

我有一个包含7种类型的boost变体。当我尝试使用最后两种类型时,链接器会出现段错误。我是一个64位的Linux机器上使用G ++(SuSE Linux上的gcc版本3.3.3),而我得到的错误是boost :: variant,给出段错误的链接器的问题

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是共享指针到该类提振。当我尝试在升压变型使用后两类为

Class1Tuple tup("str", pointer); 
ClassTupleItem(tup); // works fine since I used Class1Tuple 

Class6Tuple tup2("str", pointer2); 
ClassTupleItem(tup2); // causes a segfault. 

如果我定义了升压PTR被定义为类本身内部的一个typedef如下

struct Class1 
{ 
typedef boost::shared_ptr<Class1> Ptr; 
    ... 
    ... 
} 

::变体(互换Class6的和1类)

typedef boost::variant< Class6Tuple, Class2Tuple, Class3Tuple, 
         Class4Tuple, Class5Tuple, Class1Tuple, 
         Class7Tuple > ClassTupleItem; 

然后编译此代码

,当我得到一个segfault
+2

邮编请。这是没有足够的信息来诊断问题。 – 2010-02-23 14:50:04

+0

实际的错误信息也会有帮助 – 2010-02-23 15:13:00

+0

如果我不得不猜测,也许重名的名称溢出内部缓冲区链接器和编译器。如果您的typedefs本身位于命名空间内,请尝试将它们取出并查看问题是否消失。尽管如此,段错误无论是编译器还是链接器错误,您都应该使用简单的测试用例将它们提交给GCC bugzilla。 – 2010-02-23 15:54:46

回答

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它应该是一个不同的类型,shared_ptr<Class6>的。

struct Class1 
{ 
    typedef boost::shared_ptr<Class1> Ptr; 
    /* ... */ 
}; 

/* ... */ 

struct Class6 
{ 
    typedef boost::shared_ptr<Class6> Ptr; 
    /* ... */ 
}; 

编辑:下面的代码使用g ++ 3.3.6正确编译。我目前无法在gcc 3.3.3和SUSE Linux上进行测试。请尝试编译这个,看看链接器是否仍然提供段错误。

#include <boost/shared_ptr.hpp> 
#include <boost/tuple/tuple.hpp> 
#include <boost/variant.hpp> 
#include <string> 

struct Class1 
{ 
    typedef boost::shared_ptr<Class1> Ptr; 
    /* .... */ 
}; 

struct Class2 
{ 
    typedef boost::shared_ptr<Class2> Ptr; 
    /* .... */ 
}; 

struct Class3 
{ 
    typedef boost::shared_ptr<Class3> Ptr; 
    /* .... */ 
}; 

struct Class4 
{ 
    typedef boost::shared_ptr<Class4> Ptr; 
    /* .... */ 
}; 

struct Class5 
{ 
    typedef boost::shared_ptr<Class5> Ptr; 
    /* .... */ 
}; 

struct Class6 
{ 
    typedef boost::shared_ptr<Class6> Ptr; 
    /* .... */ 
}; 

struct Class7 
{ 
    typedef boost::shared_ptr<Class7> Ptr; 
    /* .... */ 
}; 

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; 

int main() 
{ 
    Class1::Ptr pointer; 
    Class1Tuple tup("str", pointer); 
    (ClassTupleItem(tup)); // Temporary object 
    ClassTupleItem item(tup); 

    Class6::Ptr pointer2; 
    Class6Tuple tup2("str", pointer2); 
    (ClassTupleItem(tup2)); // Temporary object 
    ClassTupleItem item2(tup2); 
} 
+0

我的指针是完全按照你的定义来声明的。 – randomThought 2010-02-24 13:29:17

+0

然后当它期望Class6 :: Ptr时,你不应该能够用'Class1 :: Ptr'构造一个'Class6Tuple'对象......除非发生隐式转换。 – 2010-02-24 16:48:08

+0

错误发布代码。如果实际代码中的块和每个块的指针都用自己的类声明,则这两个函数在它们自己的代码块中定义 – randomThought 2010-02-24 17:28:04