Устаревать шаблонное имя класса с псевдонимом шаблона (введите псевдоним, используя 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>;

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

8

Решение

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 [[устарело]].

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]