编译器的不同行为-模板-模板参数
Different behavior of compilers - template template argument
假设我有以下代码:
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类将自己称为模板模板参数?),但我不能理解标准的14.6.1/2,还看到了LLVM错误14350(http://www.mail-archive.com/llvmbugs@cs.uiuc.edu/msg21095.html)。那么,clang和intel在这里错了吗?
14.6.1表示:
注入的类名可以用作模板名或类型名。当它与模板参数列表一起使用时,作为模板的模板参数,或者作为友元类模板声明的精化类型说明符中的最终标识符时,它指的是类模板本身。
"注入的类名"是"注入"到类的作用域中的类模板(B
)的名称。换句话说,它指的是在类B
的定义中使用非限定名称B
。如果在需要模板名称的上下文中使用该名称:即,使用显式模板参数(B<int>
)或作为采用模板模板参数的模板的模板参数(A<B>
),则该名称应指代模板本身。
所以,gcc是对的。
此外,在C++11中,<::B>
中的<
之后不需要空格。根据第2.5节第3段,当将输入流划分为令牌时:
如果接下来的三个字符是
<::
,并且随后的字符既不是:
也不是>
,则<
本身被视为预处理器令牌,而不是替代令牌<:
的第一个字符。(<:
是写入[
的另一种方式。)
相关文章:
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 没有名称的C++模板参数
- 如何将enable-if与模板参数和参数包一起使用
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 何时提供默认参数作为模板参数
- 是否可以对零模板参数进行模板专门化
- 将结构字段的类型展开为可变模板参数
- Clang bug?使用指针作为模板参数
- 函数作为模板参数,是否对返回类型强制约束
- 模板构造函数中的C++模板参数
- variadic模板中的模板参数推导失败
- 遍历模板参数
- 当给定默认值时,为什么此模板参数推导失败
- 模板参数推导失败,函数参数/参数不匹配
- 类模板参数推导-clang和gcc不同
- '尝试解析可变参数模板时无法推断出'T的模板参数
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++