2010-10-11 25 views
4

我有下面的測試代碼範圍解析操作符和從屬名稱

#include <iostream> 
template <typename T> 

struct PS 
{ 
    template <typename U> 
    static void foo() 
    { 
     std::cout<<"Some test code"; 
    } 
}; 

template <typename T> 
void bar() 
{ 
    PS<T>::template foo<T>(); //won't compile without `::template` 
} 

int main() 
{ 
    bar<int>(); 
} 

ISO C++ 03 14.2/4:說

當一個成員模板專業化的名稱後面顯示。或者 - >在後綴表達式中,或者在限定id中嵌套名稱說明符之後,並且postfix-expression或qualified-id顯式依賴於模板參數(14.6.2),成員模板名稱必須以關鍵字模板爲前綴。否則,該名稱被假定爲命名非模板

標準談到->.但不是::。它是C++ 03標準中的缺陷,還是我錯過了一些東西?有人請賜教。

但措辭已N3126

被改變。當一個成員模板專業化的名字後出現。或者 - >在後綴文本表達式中或在嵌入名稱指定符後處於限定標識符中,並且post-x表達式或合格標識符中的嵌套名稱指定符的對象或指針表達式取決於模板參數(14.6.2),但不涉及當前實例化的成員(14.6.2.1),成員模板名稱必須爲 ,並由關鍵字模板預填。否則,該名稱被假定爲命名一個非模板。

有人可以舉一個例子來說明什麼but does not refer to a member of the current instantiation意味着在C + + 0x的上下文?

-PS

回答

6

標準談到->.但不是::

範圍解析運算符(::)是合格-ID的部分提到了 「或在合格-ID嵌套名稱說明符」。

C++ 0x中的附加字符是CWG defect 224的分辨率的一部分。實際上,從屬名稱的定義已更改:

決定名稱是依賴還是非依賴應該基於查找,而不是名稱的形式:如果可以查找名稱在定義的上下文中,不能作爲專門化的結果,名稱應該是非依賴的。

+1

請注意,標準對「qualified-id」的使用在很多地方都是錯誤的,所以最好不要在它說「qualified-id」時採用它。例如,在以下變量聲明中,您需要':: template',但嵌套名稱說明符不會出現在限定符中(但嵌套在「類型說明符」中):'typename T :: template alloc a;'。實際上,標準中使用「合格id」最常反映意義「合格名稱」的意圖。 – 2010-10-11 12:20:39

3

有人可以舉一個例子來說明什麼「但並未提及當前實例中的一員」中的C++ 0x的背景下意味着什麼?

我不知道這是否實際上在C++ 03和C++ 0x的實現之間表現不同。

template< typename Q > 
struct A { 
    template< typename T > 
    void f(T); 

    void g() { 
     this->f<Q>(5); // member of current instantiation is not ambiguous 

     A< identity<Q> >().template f<5>(); // suppose A is partially 
// specialized on identity. Legal but confusing; need help from template keyword. 
    } 
};