1

我正在嘗試爲類需要指向成員的指針創建一個typedef。來形容它的最好辦法是顯示的最小示例代碼:指向類內成員的指針

template<typename T, int T::*MV> 
struct Bar 
{ 
    const int &value(const T &t) const 
    { 
     return (t.*MV); 
    } 
}; 

struct Foo 
{ 
    int baz; 

    typedef Bar<Foo, &Foo::baz> GetBaz; // Compiler error 
}; 

typedef Bar<Foo, &Foo::baz> GetFooBaz; // Compiles just fine 

int main(int argc, char* argv[]) 
{ 
    Foo f = { 42 }; 
    Foo::GetBaz b; // Fails to compile 
    GetFooBaz b2; // Fine 

    int val = b.value(f); // Fails to compile because of above 
    int val2 = b2.value(f); // Fine 
} 

我不一定得到進入這樣一個成員指針死心塌地,我會被罰款只知道偏移量爲變量並有Bar :: value函數執行欺騙。

作爲最後的手段,我想我可以使用traits類,因爲它會將類的定義移到類的外部,但是我希望能夠在正在使用的變量附近聲明typedef。

而且,爲了回答「你爲什麼要這樣做」的問題,這是一個緊密代表MEF(C#工作方式)的IoC容器。

我使用的特定編譯器是VC12,但是如果VC11也支持它,它會很好。

感謝

編輯:

下面是錯誤消息

1> ------構建開始:項目:MemVarBug,配置:調試的Win32 ------ 1> MemVarBug.cpp 1> memvarbug.cpp(20):錯誤C2327:'Foo :: baz':不是類型名稱,靜態或枚舉器 1> memvarbug.cpp(20):錯誤C2065:'baz ':未聲明的標識符 1> memvarbug.cpp(20):錯誤C2975:'MV':'Bar'的無效模板參數,時間常量表達式 1> memvarbug.cpp(7):參見'MV'聲明 ==========構建:0成功,1失敗,0最新,0跳過=== =======

+0

請發佈編譯器錯誤消息。 – japreiss 2012-07-07 17:48:45

+0

用gcc-4.6.1編譯得很好。 – 2012-07-07 17:53:44

+1

@ n.m。這個問題被標記爲vc12 – Mranz 2012-07-07 18:02:21

回答

0

你可以做下面的技巧: 聲明baz是int [1]; 大小爲1的數組,在這種情況下,調用baz將返回指針並調用* baz將返回值。