【问题标题】:Scope resolution instead of . operator for template class argument范围解析而不是 .模板类参数的运算符
【发布时间】:2014-12-31 16:34:42
【问题描述】:

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

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 节非类型参数

【问题讨论】:

    标签: c++ class-template


    【解决方案1】:

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

    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.
    

    【讨论】:

      猜你喜欢
      • 2015-09-06
      • 1970-01-01
      • 2012-04-20
      • 2018-04-24
      • 1970-01-01
      • 2012-02-14
      • 2010-09-09
      • 2013-06-13
      • 2015-12-18
      相关资源
      最近更新 更多