我有下面的測試代碼範圍解析操作符和從屬名稱
#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
請注意,標準對「qualified-id」的使用在很多地方都是錯誤的,所以最好不要在它說「qualified-id」時採用它。例如,在以下變量聲明中,您需要':: template',但嵌套名稱說明符不會出現在限定符中(但嵌套在「類型說明符」中):'typename T :: template alloc a;'。實際上,標準中使用「合格id」最常反映意義「合格名稱」的意圖。 –
2010-10-11 12:20:39