2016-02-11 74 views
0

我已經定義了以下的boost ::變種類型:爲什麼我的結構沒有boost :: variant類型的成員,但可以有vector <boost :: variant>類型的成員?

#include <boost/variant.hpp> 
#include <vector> 
#include <string> 

struct SharedNodeType; 
typedef float TypeA; 
typedef int TypeB; 
typedef std::string TypeC; 
typedef char* TypeD; 

typedef boost::variant 
<TypeA, TypeB, TypeC, TypeD, SharedNodeType> BaseNodeType; 

凡類型A,類型B,TypeC,和類型是完全合格的,完整的類型(確切類型是不相關的,但在這種情況下,他們是其他結構)。

而且我已經定義了以下結構:

struct SharedNodeType 
{ 
    std::string nodeName; 
    BaseNodeType node; 
}; 

然而,正如上面寫不會編譯,給人錯誤的頁面(太多太多,包括在這裏)的結構,主要是涉及到「不完整鍵入不允許。「

的第一個編譯器錯誤是:

In file included from ./apps/iv_parserTest.cc(1): 
/opt/common/boost/1.50.py2.7/include/boost/mpl/sizeof.hpp(27): error: incomplete type is not allowed 
: mpl::size_t< sizeof(T)> 

,如果我改變了結構的下面,它編譯沒有問題:

struct SharedNodeType { 
    std::string nodeName; 
    std::vector<BaseNodeType> node; 
}; 

由於我SharedNodeType將永遠不會有不止一個節點,這對我來說似乎很浪費。

爲什麼結構的第二種形式會編譯,但第一種形式不會?

編輯: 經過一番試驗後,我確定問題似乎在於BaseNodeType變體類型也包含SharedNodeType。我相應地更新了我的代碼示例,但它仍然留下了爲什麼編譯器能夠解析這些類型(如果它們在std::vector之內但不是其他方式)的問題。

+5

顯示[MCVE]請。 –

+0

當您執行'BaseNodeType節點;'時,'TypeA,TypeB,TypeC,TypeD'是否已知? – NathanOliver

+0

什麼是引發的實際編譯器錯誤? –

回答

4

使用類型作爲成員需要它是完整的(顯然,因爲需要知道大小)。

因此有catch-22(變體的大小取決於現在的SharedNodeType的大小,反之亦然)。

您需要不中斷依賴週期。


意外的解決方案

你遇到了,當你使用std::vector<BaseNodeType>這一翻譯的BaseNodeType和您的特定庫實現客客氣氣/意外支持此一意外解決方法/解決方案。

據我所知,這從來就不是標準庫容器的必需特性,事實上,我想我記得規格的要求是,value_type在實例化時是完整的。現在

,你仍然可以通過切換到升壓集裝箱的vector模板(boost::containers::vector<BaseNodeType>),其中明確不使用不完全類型支持實例使用此解決方法可靠。

神火解決方案

升壓變有它自己的使用不完全類型處理專爲創建(潛在的)遞歸variant類型設施。

你的原始樣本是這樣的,固定的:

Live On Coliru

#include <boost/variant.hpp> 
#include <vector> 
#include <string> 

struct SharedNodeType; 
typedef float  TypeA; 
typedef int   TypeB; 
typedef std::string TypeC; 
typedef char*  TypeD; 

typedef boost::variant<TypeA, TypeB, TypeC, TypeD, boost::recursive_wrapper<SharedNodeType> > BaseNodeType; 

struct SharedNodeType 
{ 
    std::string nodeName; 
    BaseNodeType node; 
}; 

int main() { 
    BaseNodeType bnt; 
    SharedNodeType snt; 
} 
相關問題