我正在嘗試爲類需要指向成員的指針創建一個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跳過=== =======
請發佈編譯器錯誤消息。 – japreiss 2012-07-07 17:48:45
用gcc-4.6.1編譯得很好。 – 2012-07-07 17:53:44
@ n.m。這個問題被標記爲vc12 – Mranz 2012-07-07 18:02:21