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