我正在尝试为类中创建一个需要指向成员指针的模板的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。
而且,为了回答“你为什么要这样做”的问题,这就是一个IoC容器,它代表了MEF(C#的工作方式)。
我使用的特定编译器是VC12,但如果VC11支持它也会很好。
由于
编辑:
以下是错误消息
1&gt; ------ Build build:项目:MemVarBug,配置:调试Win32 ------ 1 GT; MemVarBug.cpp 1&gt; memvarbug.cpp(20):错误C2327:'Foo :: baz':不是类型名称,静态或枚举器 1&gt; memvarbug.cpp(20):错误C2065:'baz':未声明的标识符 1&gt; memvarbug.cpp(20):错误C2975:'MV':'Bar'的模板参数无效,预期的编译时常量表达式 1 GT; memvarbug.cpp(7):看'MV'的声明 ==========构建:0成功,1个失败,0个最新,0个跳过==========
答案 0 :(得分:0)
您可以执行以下操作: 宣布baz为int [1]; 大小为1的数组,在这种情况下,调用baz将返回指针并调用* baz将返回值。