0

以下のコードは正常にコンパイルされます。

template <typename T, T nontype_param>
class C;

class X {
public:

  int n;
  };

int main()
{

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

    return 1;
}

?ではなく、スコープ解決演算子がここでどのように機能する. operatorか このような非静的メンバーへのアクセスは許可されていますか?

参照: C++ テンプレート完全ガイド、セクション 8.3.3 非型引数

4

1 に答える 1

6

はい、このコードは有効であり、混乱の原因は実際にはテンプレートに関連していません。

int X::*メンバーへのポインター (具体的には、inttype のデータ メンバーへのポインター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.
于 2014-12-31T16:37:34.837 に答える