范围分辨率而不是。模板类参数的运算符

时间:2014-12-31 16:34:42

标签: 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;
}

Scope解析运算符如何在此处工作而不是. operator?我们是否可以访问这样的非静态成员?

参考:C ++模板完整指南,第8.3.3节“非类型参数”

1 个答案:

答案 0 :(得分:6)

是的,此代码有效,您的混淆源实际上与模板无关。

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.