包含依赖于类成员的模板的类

时间:2013-05-20 16:36:52

标签: c++ templates pointer-to-member

目标是制作一种“智能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编译器错误是什么?

1 个答案:

答案 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
};