Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 作用域解析运算符和从属名称_C++_Templates - Fatal编程技术网

C++ 作用域解析运算符和从属名称

C++ 作用域解析运算符和从属名称,c++,templates,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

我有以下测试代码

#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>();
}
#包括
模板
结构PS
{
模板
静态void foo()
{
标准::cout
该标准讨论的是
->
,而不是

作用域解析运算符(
)是限定id的一部分,该限定id由“或限定id中嵌套的名称说明符之后”引用

C++0x中的附加措辞是解析的一部分。实际上,从属名称的定义已更改:

关于名称是否依赖的决定应该基于查找,而不是名称的形式:如果名称可以在定义上下文中查找,并且不能作为专门化的结果是其他任何内容,则名称应该是非依赖的

有人能举个例子来说明“但不引用当前实例化的成员”在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.
    }
};
模板
结构A{
模板
空隙f(T);
void g(){
this->f(5);//当前实例化的成员没有歧义
A()。模板f<5>();//假设A部分
//专门研究身份。合法但容易混淆;需要模板关键字的帮助。
}
};

请注意,标准中使用的“限定id”在很多地方都是错误的,因此最好不要在它说“限定id”时用词。例如,在下面的变量声明中,您需要
::template
,但嵌套的名称说明符不会出现在限定id中(而是嵌套在
类型说明符中
):
typename T::template alloc a;
。事实上,在标准中使用“限定id”通常反映了“限定名称”的含义。