将某些C++11代码从Clang移植到g++的端口。
问题: 模板别名不应该完全可以与其基础表达式互换吗?这是g++的错误吗?
更新: Visual C++在类外定义中也接受模板别名。
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, "");
}
对于任何g++版本,我会遇到像这样的错误,而对于Clang(3.1到SVN trunk版本),则会出现不同的行为。
如果我使用完整的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;
typename S<T>::value_type
代替模板别名 value_t<S<T>>
,那么g++也可以工作。问题: 模板别名不应该完全可以与其基础表达式互换吗?这是g++的错误吗?
更新: Visual C++在类外定义中也接受模板别名。
typename S<T>::value_type
的用法是否有效以及您可以替代它写什么,存在一个古老的问题:http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2。 - Johannes Schaub - litb