首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCC5:嵌套变量模板不是函数模板吗?

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

Stack Overflow用户
提问于 2017-08-10 07:43:53
回答 1查看 216关注 0票数 0

我正在使用GCC 5.4 ( C++14 )编译以下C++14代码:

代码语言:javascript
复制
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>;
}

但我犯了以下错误:

代码语言:javascript
复制
<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或更多,或更佳3.9以上没有问题。但是对于我尝试过的所有版本的GCC5来说都是一样的。

我找不到原因吗?通常,GCC5应该是完整的C++14特性。

对于仍然使用变量模板的GCC5中的这个问题,有简单的解决办法吗?我不想再使用简单的特性,因为我正在将我的所有特性转换为使用可变模板。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-10 07:53:44

它是在gcc6中修复的一个bug,如dupe中所示。

在保留模板变量的同时,似乎没有解决办法。

对于避免使用变量模板的解决方案,可以使用好的旧静态、非模板化变量:

代码语言:javascript
复制
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;
}

或警察的模板功能:

代码语言:javascript
复制
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>();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45607450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档