gpt4 book ai didi

c++ - 编译器的不同行为 - 模板模板参数

转载 作者:行者123 更新时间:2023-11-28 07:45:55 24 4
gpt4 key购买 nike

假设我有以下代码:

template <template <typename> class T>
class A {};

template <typename T>
class B
{
A<B> instance;
};

int main()
{
B<int> instance;
}

gcc 4.7.2 和 gcc 4.8.0 编译这段代码没问题,而 icc 13.0.1 和 clang 3.2 给了我一个错误(clang 需要::B 而不是 B,而 icc 在模板实例化中还需要 < 之后的空格) .

谁是对的?

我找到了关于它的帖子 ( Template class that refers to itself as a template template parameter? ),但我无法理解标准的 14.6.1/2 并且还看到了 LLVM 错误 14350 ( http://www.mail-archive.com/llvmbugs@cs.uiuc.edu/msg21095.html )。那么,这里的 clang 和 intel 错了吗?

最佳答案

14.6.1 说:

The injected-class-name can be used as a template-name or a type-name. When it is used with a template-argument-list, as a template-argument for a template template-parameter, or as the final identifier in the elaborated-type-specifier of a friend class template declaration, it refers to the class template itself.

“injected-class-name”是类模板的名称 (B)“注入(inject)”到类的范围内。换句话说,它指的是使用非限定名称B。在类的定义内 B .如果您在需要模板名称的上下文中使用该名称:即,使用显式模板参数(B<int>)或作为采用模板模板参数(A<B>)的模板的模板参数,它应该引用模板本身。

所以,gcc 是对的。

此外,在 C++11 中,< 之后不需要空格在 <::B> .根据2.5节第3段,将输入流划分为token时:

if the next three characters are <:: and the subsequent character is neither : nor >, the < is treated as a preprocessor token by itself and not as the first character of the alternative token <:. (<: is another way of writing [.)

关于c++ - 编译器的不同行为 - 模板模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14882730/

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