我有一个包含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
邮编请。这是没有足够的信息来诊断问题。 – 2010-02-23 14:50:04
实际的错误信息也会有帮助 – 2010-02-23 15:13:00
如果我不得不猜测,也许重名的名称溢出内部缓冲区链接器和编译器。如果您的typedefs本身位于命名空间内,请尝试将它们取出并查看问题是否消失。尽管如此,段错误无论是编译器还是链接器错误,您都应该使用简单的测试用例将它们提交给GCC bugzilla。 – 2010-02-23 15:54:46