我正在尝试使用GCC 5.4(online example)编译以下C ++ 14代码:
template<typename T>
struct traits {
template<typename X>
static constexpr bool vect = true;
};
template<typename T1, typename T2>
constexpr bool all_vect = traits<T1>::template vect<T2>;
bool something() {
return all_vect<void, double>;
}
但是我收到了以下错误:
<source>: In instantiation of 'constexpr const bool all_vect<void, double>':
<source>:11:12: required from here
<source>:8:16: error: 'template<class X> constexpr const bool traits<void>::vect<X>' is not a function template
constexpr bool all_vect = traits<T1>::template vect<T2>;
^
<source>:8:16: error: 'vect<T2>' is not a member of 'traits<void>'
Compiler exited with result code 1
虽然我在GCC 6.1或更高版本或clang 3.9或更高版本中没有任何问题。但是我试过的所有版本的GCC5都是一样的。
我找不到这个原因?通常,GCC5应该是C ++ 14功能完整。
GCC5中仍有使用变量模板的问题是否有简单的解决方法?我宁愿不回去使用简单的特征,因为我将所有特征都转换为使用变量模板。
答案 0 :(得分:1)
这是在gcc6中修复的错误,如欺骗所示。
看起来在保留模板变量时没有解决方法。
对于避免使用变量模板的变通方法,您可以使用旧的静态非模板化变量:
template<typename T>
struct traits {
template<typename X>
struct Is_vect
{
static constexpr bool value = true;
};
};
template<typename T1, typename T2>
struct Are_all_vect
{
static constexpr bool value = traits<T1>::template Is_vect<T2>::value;
};
bool something() {
return Are_all_vect<void, double>::value;
}
或constexpr模板化函数:
template<typename T>
struct traits {
template<typename X>
static constexpr bool vect() { return true; }
};
template<typename T1, typename T2>
constexpr bool all_vect() { return traits<T1>::template vect<T2>(); }
bool something() {
return all_vect<void, double>();
}