Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 包含依赖于类成员的模板的类_C++_Templates_Pointer To Member - Fatal编程技术网

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

C++ 包含依赖于类成员的模板的类,c++,templates,pointer-to-member,C++,Templates,Pointer To Member,我们的目标是制作一种“智能getter”,它从当前对象中获取值(如果当前对象存在),如果当前对象不存在,则在父对象中查找该值 因此,这个ValueGetter类包含指向它所包含的对象的指针(作为构造函数中的运行时参数获取),以及指向它所操作的成员的指针(作为模板参数) 这是最简单的例子: template <class StyleType, int StyleType::*value> struct ValueGetter { ValueGetter(StyleType* con

我们的目标是制作一种“智能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
};
模板
结构参数获取程序
{
ValueGetter(样式类型*包含在中);
int get();
//查看此样式中是否存在该值,
//如果不是,则在父样式中查找值
};
结构样式
{
风格*父母;
INTA;
ValueGetter x;//错误:“Style::a”:不是类型名、静态或枚举数
};
当我将x移到类的作用域之外时,它将编译。 通常,类可能包含依赖于类类型的模板,那么为什么这不起作用呢? 有没有其他方法可以解决这个问题,而不必在构造函数中存储运行时指向成员的指针?(因此该结构将包含每个值的额外指针)

< >编辑:我只是在GCC中成功编译了它,但在MSVC(2012)中没有这样做,所以MSVC编译器错误?

< P>我不认为指针(不与T*类型中的指针类型混淆)被允许作为03个C++中的模板参数,只允许类型名、积分常量或枚举常数。甚至不是浮点/双常量。这包括类成员指针

更新: 此外,静态非类型参数也起作用:

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
};
模板
结构参数获取程序
{
ValueGetter(样式类型*包含在中);
int get();
//查看此样式中是否存在该值,
//如果不是,则在父样式中查找值
};
结构样式
{
风格*父母;
静态int a;
ValueGetter x;//错误:“Style::a”:不是类型名、静态或枚举数
};

您使用的编译器是什么?注意:您在MSVC 2012中编写的GCC 4.7.2上的代码片段。
int样式类型::*
应该是什么?如前所述,这似乎是惊人的MSVC2012 C++11编译器中的一个缺陷。:)
a
不在场意味着什么?
a
是否必须是
Style
的裸体成员?即,
模板结构属性{static_assert(std::is_base::value,“CRTP failure”);T value;},使用
GetProperty(object)
访问技术?