Порт некоторого кода С++ 11 от Clang до g++
template<class T>
using value_t = typename T::value_type;
template<class>
struct S
{
using value_type = int;
static value_type const C = 0;
};
template<class T>
value_t<S<T>> // gcc error, typename S<T>::value_type does work
const S<T>::C;
int main()
{
static_assert(S<int>::C == 0, "");
}
дает различное поведение для Clang (версии 3.1 через соединительную линию SVN) по сравнению с любой версией g++. Для последнего я получаю ошибки как этот
prog.cc:13:13: error: conflicting declaration 'value_t<S<T> > S< <template-parameter-1-1> >::C' const S<T>::C; ^ prog.cc:8:29: note: previous declaration as 'const value_type S< <template-parameter-1-1> >::C' static value_type const C = 0; ^ prog.cc:13:13: error: declaration of 'const value_type S< <template-parameter-1-1> >::C' outside of class is not definition [-fpermissive] const S<T>::C;
Если вместо псевдонима шаблона value_t<S<T>>
я использую полный typename S<T>::value_type
, тогда g++ также работает.
Вопрос: не являются ли псевдонимы шаблонов полностью взаимозаменяемыми с их основным выражением? Это ошибка g++?
Обновить. Visual С++ также принимает шаблон псевдонима в определении вне класса.