GCC5:嵌套变量模板不是函数模板吗?

时间:2017-08-10 07:43:53

标签: c++ gcc c++14

我正在尝试使用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中仍有使用变量模板的问题是否有简单的解决方法?我宁愿不回去使用简单的特征,因为我将所有特征都转换为使用变量模板。

1 个答案:

答案 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>();
}