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

use*_*264 6 c++ oop class constants typename

我应该写:

template<class T> class Foo {
    typename const T* x;
};
Run Code Online (Sandbox Code Playgroud)

或者:

template<class T> class Foo {
    const typename T* x;
};
Run Code Online (Sandbox Code Playgroud)

Nat*_*ica 7

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);
}
Run Code Online (Sandbox Code Playgroud)

你会得到一个编译器错误,typename const T::const_iterator bar = t.begin();类似于

预期在“const”之前有嵌套名称说明符

然而

const typename T::iterator bar = t.begin();
Run Code Online (Sandbox Code Playgroud)

效果很好。


有关何时、何地、为何以及template需要typename出现的全面说明,请参阅:Where and Why do I have to put the "template" and "typename" keywords?


gsa*_*ras 4

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

main.cpp:4:20: error: expected a qualified name after 'typename'
    const typename T* x;
                   ^
Run Code Online (Sandbox Code Playgroud)

在这里你需要一些类似的东西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
Run Code Online (Sandbox Code Playgroud)

相关示例预期 'typename' 之后有一个限定名称


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

阅读更多内容:正式地,typename 的用途是什么?