首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在结构内部模板参数化中的应用

在结构内部模板参数化中的应用
EN

Stack Overflow用户
提问于 2016-03-31 04:04:44
回答 1查看 390关注 0票数 0

这是我发现和描述here的问题的延续。

假设您有一个包含static constexpr函数的结构和一个std::bitset的类型别名(或者您希望使用const表达式的结果来模板的任何类型),如下所示:

代码语言:javascript
复制
struct ExampleStruct {
    static constexpr std::size_t Count() noexcept {
        return 3U;
    }
    using Bitset = std::bitset<Count()>;
};

Visual 2015版本14.0.25029.00更新2RC以红色高亮显示Count()调用并生成错误function call must have a constant value in a constant expression

如何使其编译,或取得类似的结果?

究竟是什么导致了这里的错误?编译器是否试图在const表达式函数之前生成类型别名?

编辑:可以在下面找到为什么这种方法不能工作的解释,但是由于没有人提供可能的解决办法,下面是我想出的一些方法:

(1)使用模板时,将类型别名存储到此类型。

代码语言:javascript
复制
template<typename T>
struct ExampleStruct {
    using ThisType = ExampleStruct<T>;
    static constexpr std::size_t Count() noexcept {
        return 3U;
    }
    using Bitset = std::bitset<ThisType::Count()>;
};

(2)将Count()函数移出结构体。

代码语言:javascript
复制
static constexpr std::size_t Count() noexcept {
    return 3U;
}

struct ExampleStruct {
    using Bitset = std::bitset<Count()>;
};

(3)将constexpr方法替换为constexpr成员变量。

代码语言:javascript
复制
struct ExampleStruct {
    static constexpr std::size_t Count = 3U;
    using Bitset = std::bitset<Count>;
};

(4)将值存储在constexpr成员变量中,并从Count()方法返回此值。

代码语言:javascript
复制
struct ExampleStruct {
private:
    static constexpr std::size_t m_count = 3U;
public:
    static constexpr std::size_t Count() noexcept {
        return m_count;
    }
    using Bitset = std::bitset<m_count>;
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-31 06:18:41

您可能已经注意到,如果将一行或两行移出类主体,错误就会消失。您遇到的问题是,类成员函数定义(甚至内联定义)直到解析完整个类定义之后才会被解析;因此,当编译器看到using Bitset = std::bitset<Count()>;时,Count已经声明,但还没有定义,而未定义的constexpr函数不能在常量表达式中使用--因此您得到了所看到的错误。不幸的是,我不知道有什么好的解决方案或解决办法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36323932

复制
相关文章

相似问题

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