C++ 范围解析,而不是。模板类参数的运算符

C++ 范围解析,而不是。模板类参数的运算符,c++,class-template,C++,Class Template,下面给出的代码编译成功: template <typename T, T nontype_param> class C; class X { public: int n; }; int main() { C<int X::*, &X::n>* c; //Here return 1; } 模板 丙级;; X类{ 公众: int n; }; int main() { C*C;//这里 返回1; } 作用域解析运算符在此处的工作方

下面给出的代码编译成功:

template <typename T, T nontype_param>
class C;

class X {
public:

  int n;
  };

int main()
{

    C<int X::*, &X::n>* c; //Here 

    return 1;
}
模板
丙级;;
X类{
公众:
int n;
};
int main()
{
C*C;//这里
返回1;
}
作用域解析运算符在此处的工作方式,而不是
。操作员
?允许我们访问这样的非静态成员吗


< C++ >模板:完全指南,第83.3节非类型参数

是的,这个代码是有效的,并且你的混淆源实际上与模板无关。
int X::*
是指向成员的指针(特别是指向
int
类型
X
上的数据成员的指针)。指针本身并不传递对象的实例,因此您确实可以获取指向非静态成员的指针。(事实上,指向静态成员的指针只能是常规指针,而不是指向成员的指针!)

在使用指针时提供对象实例,而不是在获取指针时

// Declare a pointer to a data member of type int on object of type X, and
// initialize it to point to the X::n member.
int X::*ptr = &X::n;

// *ptr is not valid on member pointers. Rather, we need to supply an instance:
X instance;

// Then use the member pointer dereference operator .*
(instance.*ptr) = 5; // Same as "instance.n = 5;" in this case.

是的,这段代码是有效的,您的困惑的根源实际上与模板无关

int X::*
是指向成员的指针(特别是指向
int
类型
X
上的数据成员的指针)。指针本身并不传递对象的实例,因此您确实可以获取指向非静态成员的指针。(事实上,指向静态成员的指针只能是常规指针,而不是指向成员的指针!)

在使用指针时提供对象实例,而不是在获取指针时

// Declare a pointer to a data member of type int on object of type X, and
// initialize it to point to the X::n member.
int X::*ptr = &X::n;

// *ptr is not valid on member pointers. Rather, we need to supply an instance:
X instance;

// Then use the member pointer dereference operator .*
(instance.*ptr) = 5; // Same as "instance.n = 5;" in this case.