簡體   English   中英

使用模板別名(類型別名,使用,C ++ 11)棄用模板化的類名稱?

[英]Deprecate templated class name with template alias (type alias, using, C++11)?

我想重命名一個模板化的類。 為了使用戶更容易轉換,我想將舊類保留一個版本,並使用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>;

我是否會遺漏某些內容或者編譯器是否支持這些內容? 還有其他想法在不復制整個課程的情況下獲得棄用警告嗎?

從版本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 [[已棄用]]也是如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM