【问题标题】:Deprecate templated class name with template alias (type alias, using)?不推荐使用模板别名(类型别名,使用)的模板化类名?
【发布时间】:2013-11-05 14:56:47
【问题描述】:

我想重命名一个模板类。为了使用户的过渡更容易,我想将旧类保留为另一个版本,并使用 GCC / Clang 的扩展将其标记为已弃用(不推荐使用属性)。 为了避免保留已弃用类的精确副本,使用模板别名会很方便。不幸的是,它似乎不起作用。这是我在 Clang 3.3、GCC 4.7 和 GCC 4.8 中尝试过的:

template <class blabla>
struct NewClassName
{
    // ...
};

template <class blabla> using OldClassName [[deprecated]]
  = NewClassName<blabla>;

我错过了什么还是编译器不支持?是否有其他想法可以在不复制整个课程的情况下获得弃用警告?

【问题讨论】:

  • 它在 4.8 和 4.7 中运行良好,并发出弃用警告。 Live code
  • 你说得对,我用一个稍微复杂一点的例子来测试它,它适用于 4.7 和更高版本。不幸的是,Clang 3.3 发出了一个错误。
  • 我会打开一个bug来clang。
  • @n.m.:是的,这似乎是一个错误,但这只是一个扩展,他们并没有承诺它可以与using 一起使用。见here

标签: c++ templates c++14 deprecated template-aliases


【解决方案1】:

GCC 从 4.9 版开始支持弃用模板别名(从 4.7 开始,__attribute__(deprecated))。这是一个比较 typedef 和模板别名的测试用例:

template <class T>
struct NewClassName
{
    // ...
};

template <class T> using OldClassNameUsing [[deprecated]]
  = NewClassName<T>;

typedef NewClassName<int> OldClassNameTypedef [[deprecated]];

int main()
{
  OldClassNameUsing<int> objectUsing;
  OldClassNameTypedef objectTypedef;

  return 0;
}

它对我不起作用的原因是我没有创建 OldClassNameUsing 的对象,而是访问了像 OldClassNameUsing::myFunction() 这样的静态成员。除非函数本身已被弃用,否则这永远不会触发弃用警告。

Clang 尚不支持弃用模板别名 - 已使用版本 13 进行测试。相应的功能请求是 http://llvm.org/bugs/show_bug.cgi?id=17862 https://github.com/llvm/llvm-project/issues/18236.

【讨论】:

  • 谢谢,对我来说似乎在 Clang 3.4.1+(包括 4.0.0)和 C++11 中工作:godbolt.org/z/5CsB4v
  • @Ax3l 不,您会收到typedef 的警告,而不是using 的警告。后者是保留模板所必需的。
猜你喜欢
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多