c++ - typename 关键字和嵌套名称说明符

标签 c++ templates typename dependent-name

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/

相关文章:

c++ - 自定义 opengl 压缩纹理

c++ - 使用库中的抽象类时如何解决 "deep copy of an abstract class"问题?

c++ - 如何在 QTreeWidget 中选择一个项目?

c++ - 模板化类型定义?

c++ - 为什么必须在哪里放置 “template”和 “typename”关键字?

c++ - 如何在 gcc 上为 x86_64 启用 __fp16 类型

c++ - 为 std::vector<struct> 创建一个 getter 函数

php - Twig 模板不能包含 php 模板

c++ - 为什么必须在何处以及为什么要放置"template"和"typename"关键字?

c++ - 您如何决定模板方法的值(value)与引用