Устарело шаблонное имя класса с псевдонимом шаблона (псевдоним типа, использование)?

Я хочу переименовать шаблонный класс. Чтобы упростить переход для пользователей, я хотел бы сохранить старый класс еще для одной версии и пометить его как устаревший с расширениями из GCC/Clang (атрибут устарел). Чтобы не хранить точную копию устаревшего класса, было бы удобно использовать псевдоним шаблона. К сожалению, это не работает. Вот что я пробовал с Clang 3.3, GCC 4.7 и GCC 4.8:

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

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

Я что-то упустил или это просто не поддерживается компиляторами? Есть ли другая идея получить предупреждения об устаревании без копирования всего класса?


person usr1234567    schedule 05.11.2013    source источник
comment
Он хорошо работает в 4.8 и 4.7 и предупреждает об устаревании. Текущий код   -  person masoud    schedule 05.11.2013
comment
Вы правы, я тестировал на чуть более сложном примере, работает на 4.7 и новее. К сожалению, Clang 3.3 выдает ошибку.   -  person usr1234567    schedule 05.11.2013
comment
Я бы открыл баг на лязг.   -  person n. 1.8e9-where's-my-share m.    schedule 05.11.2013
comment
@n.m.: Да, это похоже на ошибку, однако это просто расширение, и они не обещали, что оно будет работать с using. См. здесь   -  person masoud    schedule 05.11.2013


Ответы (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 еще не поддерживает отказ от псевдонима шаблона — протестировано с версией 12. Соответствующий запрос функции: http://llvm.org/bugs/show_bug.cgi?id=17862.

person usr1234567    schedule 12.11.2013
comment
Спасибо, у меня работает в Clang 3.4.1+ (включая 4.0.0) с C++11: godbolt .org/z/5CsB4v - person Ax3l; 22.05.2020
comment
@ Ax3l Нет, вы получаете предупреждение для typedef, а не для using. Последний необходим для сохранения шаблона. - person usr1234567; 12.07.2021