struct A{};
template <typename T>
struct B
{
typename ::A a1; //(1)
typename A a2; //(2): error
};
int main(){return 0;}
为什么第一种情况正确,而第二种情况不正确?我不明白那个限制的意思。
无论如何,为什么允许第一种情况? ::A
不是依赖于模板参数的名称。什么意思?
最佳答案
如果类型嵌套在从属范围内,则规则不是您只能使用 typename
。这些规则或多或少是:
- 如果它在从属范围内,则必须使用
typename
- 您只能在语法允许的地方使用
typename
。
语法允许它用于 qualified-id 的子集,由
指定typename-specifier:
typename nested-name-specifier identifier
typename nested-name-specifier template<opt> simple-template-id
nested-name-specifier:
:: (C++14 or later)
::<opt> type-name ::
::<opt> namespace-name ::
decltype-specifier ::
nested-name-specifier identifier ::
nested-name-specifier template<opt> simple-template-id ::
所以第二种情况肯定是被禁止的,因为它不涉及任何嵌套。严格来说,在 C++14 之前,第一个也是被禁止的,因为全局限定符 ::
与该语法不匹配。
关于c++ - typename 关键字和嵌套名称说明符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27798519/