Я хочу переименовать шаблонный класс. Чтобы облегчить переход для пользователей, я бы хотел сохранить старый класс для еще одной версии и пометить его как устаревший с расширениями из 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>;
Я что-то пропустил или это просто не поддерживается компиляторами? Есть ли другая идея, чтобы получать предупреждения об устаревании, не копируя весь класс?
GCC поддерживает устаревший псевдоним шаблона начиная с версии 4.7. Это тестовый пример, сравнивающий 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 пока не поддерживает устаревший псевдоним шаблона — протестировано с версиями 3.3 и 3.4 из SVN r194323. Соответствующий запрос функции
http://llvm.org/bugs/show_bug.cgi?id=17862
Clang все еще не поддерживает эту функцию с версией 4. Это также верно для C ++ — 14 [[устарело]].
Других решений пока нет …