在C ++中,typename应该在const之前还是之后?

时间:2017-05-10 17:04:13

标签: c++ class oop const typename

我应该写:

template<class T> class Foo {
    typename const T* x;
};

或:

template<class T> class Foo {
    const typename T* x;
};

3 个答案:

答案 0 :(得分:3)

typename不是这样使用的,所以这两种情况都是无效的,应该产生编译错误,如下所示:

main.cpp:4:20: error: expected a qualified name after 'typename'
    const typename T* x;
                   ^

在这里你需要T::myType这样的东西继续下去。

甚至这个,更糟糕的是:

main.cpp:4:14: error: expected a qualified name after 'typename'
    typename const T* x;
             ^
main.cpp:4:14: error: expected member name or ';' after declaration specifiers

expected a qualified name after 'typename'中的相关示例。

  

引入了关键字typename以指定后面的标识符是类型

详细了解:Officially, what is typename for?

答案 1 :(得分:2)

typename需要使用您想要获得的类型。例如,如果你有

template <typename T>
void foo(T& t)
{
    typename const T::iterator bar = t.begin();
}

int main()
{
    std::vector<int> bar{1,2,3}
    foo(bar);
}

您将在

的行中获得typename const T::const_iterator bar = t.begin();的编译器错误
  

在'const'

之前的预期嵌套名称说明符

在哪里

const typename T::iterator bar = t.begin();

工作得很好。

有关templatetypename需要出现的时间,地点和原因的全面说明,请参阅:Where and why do I have to put the "template" and "typename" keywords?

答案 2 :(得分:0)

在这里使用extern inline char * strcpy(char * dest,const char *src) { __asm__("cld\n" "1:\tlodsb\n\t" "stosb\n\t" "testb %%al,%%al\n\t" "jne 1b" ::"S" (src),"D" (dest):"si","di","ax"); return dest; } 毫无意义。

如果您要访问typenameT::type之间不能const的别名类型,则必须使用}

typename