我正在尝试从类中为需要指向成员的指针的模板创建 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 函数执行诡计就可以了。
作为最后的手段,我想我可以使用一个特征类,因为它会将定义移到类之外,但我希望能够在所使用的变量附近声明 typedef。
而且,为了回答“你为什么要这样做”的问题,这一切都是为了一个 IoC 容器,它紧密地代表了 MEF(C# 的工作方式)。
我正在使用的特定编译器是 VC12,但如果 VC11 也支持它会很好。
谢谢
编辑:
这是错误消息
1>----- 构建开始:项目:MemVarBug,配置:调试 Win32 ------ 1> MemvarBug.cpp 1>memvarbug.cpp(20): error C2327: 'Foo::baz' : is不是类型名称、静态或枚举数 1>memvarbug.cpp(20): error C2065: 'baz' : undeclared identifier 1>memvarbug.cpp(20): error C2975: 'MV' : 'Bar' 的模板参数无效, 预期的编译时常量表达式 1> memvarbug.cpp(7) : 见 'MV' 的声明 ========== 构建: 0 成功, 1 失败, 0 最新, 0 跳过 = =========