这是我发现并描述here的问题的延续。在结构中使用constexpr方法进行模板参数化
假设你有一个包含static constexpr
功能和一个std::bitset
一个类型别名(或任何类型的你希望使用const表达式的结果模板)(如下所示)一个结构:
struct ExampleStruct {
static constexpr std::size_t Count() noexcept {
return 3U;
}
using Bitset = std::bitset<Count()>;
};
视觉Studio 2015版本14.0.25029.00 Update 2 RC突出显示Count()
红色呼叫并生成错误function call must have a constant value in a constant expression
。
如何才能得到这个编译,或达到类似的结果?
究竟是什么导致错误在这里?编译器是否试图在const表达式函数之前生成类型别名?
编辑:为什么这是行不通的解释可以在下面找到,但因为没有人提供可能的解决方法,这里有一些,我想出了:
(1)当使用模板,店输入别名这种类型。
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()
函数移动到结构体的外部。
static constexpr std::size_t Count() noexcept {
return 3U;
}
struct ExampleStruct {
using Bitset = std::bitset<Count()>;
};
(3)更换constexpr
方法与constexpr
成员变量。在constexpr
成员变量
struct ExampleStruct {
static constexpr std::size_t Count = 3U;
using Bitset = std::bitset<Count>;
};
(4)存储值,并且从Count()
方法返回此。
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>;
};
你真的编译过了吗?不要依赖智能感知。 – ZDF
尝试使用错误C2975编译错误:'_Bits':'std :: bitset',期望的编译时常量表达式无效的模板参数 –
'Count()'需要是函数吗?为什么不'静态constexpr std :: size_t Count = 3U;'? – ZDF