我有以下测试代码
#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>();
}
Run Code Online (Sandbox Code Playgroud)
ISO C++ 03 14.2/4:说
当成员模板专业化的名称出现之后.或 - >在postfix-expression中,或在qualified-id中的nested-name-specifier之后,postfix-expression或qualified-id显式依赖于template-parameter(14.6.2),成员模板名称必须是以关键字模板为前缀.否则,假定该名称命名非模板.
关于标准的谈判->和.但未谈及::.它是C++ 03标准中的缺陷还是我遗漏了什么?有人请赐教.
但是措辞已经改变了 N3126
当成员模板专业化的名称出现之后.或 - >在post fi x-expression中或在quali fi ed-id中的嵌套名称指定符之后,post fi x-expression的对象或指针表达式或者qual-fi-id中的嵌套名称-peci fi er取决于模板参数(14.6.2)但不引用当前实例化的成员(14.6.2.1),成员模板名称必须由关键字模板预先设定.否则,假定该名称命名非模板.
有人可以举例说明but does not refer to a member of the current instantiationC++ 0x的上下文中的含义吗?
-PS