目标是制作一种“智能getter”,它从当前对象中获取值,如果不存在,它会查找父对象中的值。
因此,这个ValueGetter类包含指向它所包含的对象的指针(在构造函数中将其作为运行时参数获取)以及指向它作为模板参数运行的成员的指针。
这是最简单的例子:
template <class StyleType, int StyleType::*value>
struct ValueGetter
{
ValueGetter(StyleType* containedIn);
int get();
// Looks if the value is present in this style,
// if not it looks for the value in the parent style
};
struct Style
{
Style *parent;
int a;
ValueGetter<Style, &Style::a> x; // Error: 'Style::a' : is not a type name, static, or enumerator
};
当我将x移动到类的范围之外时,它会编译。 通常,类可能包含依赖于类类型的模板,为什么这不起作用? 有没有其他方法可以解决此问题,而无需在构造函数中将指针存储在运行时的成员中? (因此结构将包含每个值的额外指针)
编辑:我刚刚在GCC中成功编译了它,但在MSVC(2012)中没有,那么这个MSVC编译器错误是什么?
答案 0 :(得分:1)
我不认为指针(不要像T *中那样混淆指针类型)作为03 C ++中的模板参数,只有类型名称,整数常量或枚举常量。甚至不是float / double常量。这包括类成员指针。
更新: 此外,静态非类型参数有效:
template <class StyleType, int *value>
struct ValueGetter
{
ValueGetter(StyleType* containedIn);
int get();
// Looks if the value is present in this style,
// if not it looks for the value in the parent style
};
struct Style
{
Style *parent;
static int a;
ValueGetter<Style, &Style::a> x; // Error: 'Style::a' : is not a type name, static, or enumerator
};