【发布时间】:2014-02-25 13:59:07
【问题描述】:
假设有这样的代码:
template <typename T>
CLASS_KEY1 X{};
PREFIX template CLASS_KEY2 X<int>;
其中CLASS_KEY1、CLASS_KEY2 和PREFIX 是宏。 CLASS_KEY1 和 CLASS_KEY2 可以扩展为 class、struct 或 union 关键字。 PREFIX 可以扩展为空字符集或 extern 关键字。
下表显示了何时为所有宏值组合(编译器 gcc-4.8.1,选项 -std=c++11)编译此类代码(Yes - 编译,No - 不编译):
PREFIX extern extern extern
CLASS_KEY1\CLASS_KEY2 class struct union class struct union
class Yes Yes? No Yes Yes? No
struct Yes? Yes No Yes? Yes No
union No No Yes No No Yes
这是 gcc 中的错误还是标准要求中的错误(奇怪的情况用问号标记)?其他编译器呢?
【问题讨论】:
-
从封装策略来看,
struct和class没有区别。我敢打赌,保留政策是在定义类的地方宣布的。 -
但是,当您尝试这样做时,clang++ 会产生警告:
warning: class template 'X' was previously declared as a struct template。两个编译器都应用在定义类的地方宣布的封装策略。 -
@Morwenn 感谢您的解释和参考。
标签: c++ templates gcc c++11 explicit-instantiation