范围解析运算符和从属名称

时间:2010-10-11 03:22:19

标签: c++ templates

我有以下测试代码

#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:说

  

当成员模板专业化的名称出现在之后。或者 - >&gt; 在postfix-expression中,或者在qualified-id中的nested-name-specifier之后,postfix-expression或qualified-id显式依赖于template-parameter(14.6.2),成员模板名称必须以关键字模板为前缀。否则,假定该名称命名为非模板

标准涉及->.,但不涉及::。它是C ++ 03标准中的缺陷还是我遗漏了什么?有人请赐教。

但是N3126

中的措辞已经改变了
  

之后显示成员模板专精的名称时。或者 - >&gt; 在post fi x-expression中或在quali fi ed-id中的嵌套名称指定符之后,以及post fi x-expression的对象或指针表达式或者qualited fi-id中的嵌套名称指定符取决于模板参数(14.6.2)但不引用当前实例化的成员(14.6.2.1),成员模板名称必须是   由关键字模板预先固定。否则,假定该名称命名非模板。

有人可以举例说明but does not refer to a member of the current instantiation在C ++ 0x上下文中的含义吗?

-PS

2 个答案:

答案 0 :(得分:6)

  

标准涉及->.,但不涉及::

范围解析运算符(::)是 nested-name-specifier 之后引用的 qualified-id 的一部分>合格-ID “。

C ++ 0x中的附加措辞是CWG defect 224的分辨率的一部分。实际上,依赖名称的定义已经改变:

  

关于名称是依赖还是非依赖的决定应基于查找,而不是基于名称的形式:如果名称可以在定义上下文中查找而不能作为专业化的结果,名称应该是非依赖的。

答案 1 :(得分: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.
    }
};