我想重命名模板化的类。为了使用户更容易过渡,我想将旧类保留一个新的版本,并使用GCC / Clang的扩展名(不推荐使用属性)将其标记为不推荐使用。为了避免保留不赞成使用的类的确切副本,使用模板别名将很方便。Unfortunatley它似乎不起作用。这是我尝试使用Clang 3.3,GCC 4.7和GCC 4.8进行的操作:
template <class blabla>
struct NewClassName
{
// ...
};
template <class blabla> using OldClassName __attribute__ ((deprecated))
= NewClassName<blabla>;
我会错过什么吗?还是编译器不支持?还有其他想法可以在不复制整个班级的情况下获得弃用警告吗?
从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的[[deprecated]]也是如此。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句