c++ - 如果嵌套类型(未访问)带有无法编译的方法,是否可以实例化模板?

标签 c++ templates g++ clang++

无意中发现g++(5.2.0)编译如下

template<typename T>
struct A {
    int x;
    struct B {
        void foo() {
            x = 1;
        }
    };
};

甚至统计 AA::B , 提供成员(member) B::foo未使用。您合理地得到了 x 的编译错误作为 A 的非静态成员即使只是编译空操作语句 &A<int>::B::foo; .

clang (3.6.2) 然而拒绝模板,即使 A根本没有实例化,因为它说非静态成员名称 x不能在 B 内使用而只是阅读模板定义。

这是 g++ 中的错误还是 clang 对未实例化的模板成员过于严格?

最佳答案

x在您的代码中是一个非依赖名称,并且标准呈现一个无法有效实例化的模板,无论您作为模板参数提供的格式是否正确,都不需要诊断(实际上这也适用于“temploids”,例如标准显示。也就是说,规则同样适用于类模板的成员)。

您的代码与访问周围类名称的任何普通类一样无效。请注意,方向在这里很重要。以下内容不会格式错误(因为您可以特化A<T>::B,例如,x 对于A<int>::B 是一个静态成员。

template<typename T>
struct A {
    struct B {
       int x;
    };

    void f() {
       B::x = 1;
    }
};

但是,封闭类模板的类型称为当前实例化,这意味着它的含义始终保持不变,不能根据模板参数而改变。因此,模板定义本身可能会因某些用途(例如您的用途)而呈现格式错误。

关于c++ - 如果嵌套类型(未访问)带有无法编译的方法,是否可以实例化模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32920488/

相关文章:

c++ - "cout"和 "char address"

c++ - 如何以线程安全的方式在 openmp 中实现每个进程一次写入全局共享变量?

c++ - 在 dllmain()/DLL_PROCESS_ATTACH 中允许实例化 com 对象?

c++ - 有没有办法一致地对类型模板参数进行排序?

c++ - Gcc/G++ 编译成 NIOS 2 程序集

c++ - 指针数组说明

c++ - 如何在编译时在初始化列表中包含不同数量的对象?

c++ - 专门化派生类中的模板成员

c++ - 将应用程序链接到 libbz2.so.1 而不是 libbz2.so.1.0

c++ - Malloc C 和 C++ 代码兼容性