2010-02-23 42 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