gpt4 book ai didi

C++ 模板定义在 clang 上失败,适用于 GCC

转载 作者:太空狗 更新时间:2023-10-29 23:16:29 27 4
gpt4 key购买 nike

以下代码在 GCC 上编译(甚至不需要最新版本),但在 clang 3.4 上失败:

template <int N>
struct T_unsigned {
typedef typename T_unsigned<N>::Type Type;
};

template <> struct T_unsigned<8> {
typedef unsigned char Type;
};

使用上面的 T_unsigned 定义,GCC 允许您使用“T_unsigned<8>::Type”而不是“unsigned char”。当我尝试使用 clang 3.4 编译它时,我得到:

test.cpp:3:41: error: no type named 'Type' in 'T_unsigned<N>'
typedef typename T_unsigned<N>::Type Type;
~~~~~~~~~~~~~~~~~~~~~~~~^~~~
1 error generated.

clang 是否无法编译正确的 C++11 代码,或者这段代码是否做了 GCC 恰好支持的非标准操作?

最佳答案

在您的一般情况下 T_unsigned<N> ,我们有:

A name is a member of the current instantiation if it is

[...]

  • A qualified-id in which the nested-name-specifier refers to the current instantiation.

    [ Example:
    template <class T> class A {
    static const int i = 5;
    int n1[i]; // i refers to a member of the current instantiation
    int n2[A::i]; // A::i refers to a member of the current instantiation
    int n3[A<T>::i]; // A<T>::i refers to a member of the current instantiation
    int f();
    };

T_unsigned<N> , T_unsigned<N>只是它自己的另一个名字。所以基本上你有这样的东西:

class Foo {
typedef Foo::Type Type;
};

“正确的”错误消息应该大约是 ( http://ideone.com/FvJHBF ):

     prog.cpp:2:17: error: ‘Type’ in ‘class Foo’ does not name a type
typedef Foo::Type Type;
^

但是,您写道您在使用特化时遇到问题 T_unsigned<8> , 这似乎没有被 clang 找到。

你的测试用例不是很详尽,所以我的答案取决于一个 if 语句:

如果在实例化时,您对 N=8 的特化可见,比 clang 更错误。如果不是,gcc 和 clang 应该都会失败,但会出现上述错误消息(尽管错误消息本身绝不是由标准定义的,所以这是一个工具应该,而不是标准的)。

关于C++ 模板定义在 clang 上失败,适用于 GCC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23754359/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com