2012-03-31 61 views
0

內成員變量的偏差是有可能有此代碼的工作不知何故? (目前得到一個編譯錯誤,指出MMVertex2F4B2F不存在) 我不想包裹2另一個結構之內,將我現有的代碼中實現類的可用性。參考POD聲明

我需要這一切在編譯時有發生,本質上是TemplatedClass需要保存的數據有關它的,我可以通過創建TemplatedClass的實例後訪問外部類。

struct MMVertex2F4B2F 
{ 
    MMPoint vertex; 
    MMColor4B col; 
    MMPoint tex; 

    struct TemplatedClass<offsetof(MMVertex2F4B2F, vertex)> {}; 
}; 

問候, 詹姆斯

+0

使用'結構MMVertex2F4B2F',而不是'MMVertex2F4B2F' – twain249 2012-03-31 22:17:48

回答

1

,你可以把你的主類的數據轉換爲子類型:

struct MMVertex2F4B2F 
{ 
    struct MMVertexData { 
    MMPoint vertex; 
    MMColor4B col; 
    MMPoint tex; 
    } Data; 
    struct TemplatedClass<offsetof(MMVertexData, vertex)> {}; 
}; 

(如果你通過成員方法來訪問數據成員,你只必須適應那些對這種變化,而不是所有的代碼)

另外,該TemplatedClass<>可以宣佈獨立(沒有一分型)■類似於特徵模板。

,你的代碼不工作表明,它的設計是有缺陷的事實。

+0

謝謝您的回答,在另一個結構包裹會打破的用法整個代碼庫的其餘部分。 – user1103741 2012-04-01 18:17:23

1

注意

struct TemplatedClass<offsetof(MMVertex2F4B2F, vertex)> {}; 

是無效的C++代碼。無論這是一個模板專業化,這將是

template <> struct TemplatedClass<offsetof(MMVertex2F4B2F, vertex)> {}; 

(這似乎並不像它會對此作出太大意義),這是應該是模板的實例的聲明,這將是

TemplatedClass<offsetof(MMVertex2F4B2F, vertex)> myInstanceVar; 

至於其他,我同意沃爾特的答案。

+0

感謝您的回答。我想要一個結構聲明,我可以稍後在代碼中進行實例化。 – user1103741 2012-04-01 18:23:08

0

offsetof宏是從C繼承而來的,它可以與POD結構一起工作,但它不是在C++中引用成員的最佳方法。在指向成員的參數化模板上。

template< typename client, MMPoint client ::* > // PTM parameter 
struct TemplatedClass { 
    … 
}; 

struct MMVertex2F4B2F 
{ 
    MMPoint vertex; 
    MMColor4B col; 
    MMPoint tex; 

    // PTM argument acceptable despite incomplete class: 
    TemplatedClass<MMVertex2F4B2F, & MMVertex2F4B2F::vertex> template_inst; 
}; 

在本例中的模板接受任何指定的類中的一個指針MMPoint類型的構件。您可能會使用其他參數化。任何事情都比字節偏移更好,並通過char *投射。

+0

我正在使用它來設置偏移到用於openGL的頂點緩衝區,所以我需要偏移量的值是一個整數以傳遞到各種設置方法。謝謝你的回答。 – user1103741 2012-04-01 18:19:36

+0

@ user1103741您也可以使用指向成員參數的指針來滾動自己的'offsetof'模板函數。這仍然會打破循環依賴並仍然會產生一個整數。 – Potatoswatter 2012-04-02 04:44:50

0

睡在它之後,我來到了這個解決方案,它似乎工作:

struct MMVertex2F4B2F 
{ 
    MMPoint vertex; 
    MMColor4B col; 
    MMPoint tex; 

    struct TemplatedClass; //Use a forward declaration here 
}; 

//The template will now work as MMVertex2F4B2F is fully declared 
struct MMVertex2F4B2F::TemplatedClass 
     : public VertDef <offsetof(MMVertex2F4B2F, vertex)> {}; 
+0

這不能工作。你正在定義一個模板,而不使用'template'關鍵字。 – Potatoswatter 2012-04-02 04:43:20

+0

是的我的錯誤應該是: struct MMVertex2F4B2F :: TemplatedClass:public VertDef {}; – user1103741 2012-04-08 12:11:51

+0

我點擊「編輯」並將你的評論複製粘貼到你的答案中。但是,同樣的錯字是阻止我們回答你的問題。我不確定是投票還是降低投票。 – Potatoswatter 2012-04-08 12:42:39