2014-12-31 75 views
0

如下代碼編譯successfuly:範圍解析代替。運營商模板類參數

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節無類型參數

回答

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.