我想重命名一个模板化的类。为了使用户更容易转换,我想将旧类保留一个版本,并使用GCC / Clang的扩展名(不推荐使用属性)标记它。 为了避免保留已弃用类的精确副本,使用模板别名会很方便。不幸的是它似乎不起作用。这是我尝试使用Clang 3.3,GCC 4.7和GCC 4.8:
template <class blabla>
struct NewClassName
{
// ...
};
template <class blabla> using OldClassName __attribute__ ((deprecated))
= NewClassName<blabla>;
我是否会遗漏某些内容或者编译器是否支持这些内容?还有其他想法可以在不复制整个类的情况下获得弃用警告吗?
答案 0 :(得分:6)
自版本4.7起,GCC支持弃用模板别名。这是比较typedef和模板别名的测试用例:
template <class T>
struct NewClassName
{
// ...
};
template <class T> using OldClassNameUsing __attribute__ ((deprecated))
= NewClassName<T>;
typedef NewClassName<int> OldClassNameTypedef __attribute__ ((deprecated));
int main()
{
OldClassNameUsing<int> objectUsing;
OldClassNameTypedef objectTypedef;
return 0;
}
它之所以不起作用,是因为我没有创建OldClassNameUsing的对象,而是访问了像OldClassNameUsing :: myFunction()这样的静态成员。除非不推荐使用函数本身,否则不会触发弃用警告。
Clang还不支持弃用模板别名 - 使用SVN r194323的3.3和3.4版测试。相应的功能请求是
http://llvm.org/bugs/show_bug.cgi?id=17862
Clang在版本4中仍不支持此功能。对于C ++ - 14 [[已弃用]]也是如此。