如何设置具体值给概念模板class显式实例化?
How to set the specific value to the concept template class explicit instantiation?
我有如下代码:
#include <concepts>
//Fibo Begins
template <std::unsigned_integral num>
struct Fibo {
constexpr static std::size_t value = Fibo<num - 1>::value + Fibo<num - 2>::value;
};
template <>
struct Fibo<1> {
constexpr static std::size_t value = 1;
};
template <>
struct Fibo<2> {
constexpr static std::size_t value = 1;
};
//Fibo ends
编译器给出参数 1 和 2 无效的错误
这里发生了什么?我该如何解决?
首先,您使用的语法是针对受限类型模板参数,而不是 non-type 具有受限类型的模板参数。所以编译器抱怨它需要一个类型作为模板参数,而不是一个值。
对于具有约束类型的 non-type 模板参数,它应该是 std::unsigned_integral auto num
。
但是 1
和 2
的类型是 int
。它们不是无符号的,您的类型约束正确地拒绝了它们。
例如,1u
和 2u
将是无符号整数并被模板参数接受。
对于具有占位符类型的 non-type 模板参数,不仅提供 value,而且提供 type,意义重大。
看起来好像您真的希望类型是 std::size_t
,而不是任何无符号整数。所以也许只是将其用作 non-type 模板参数的类型而不是约束。
我有如下代码:
#include <concepts>
//Fibo Begins
template <std::unsigned_integral num>
struct Fibo {
constexpr static std::size_t value = Fibo<num - 1>::value + Fibo<num - 2>::value;
};
template <>
struct Fibo<1> {
constexpr static std::size_t value = 1;
};
template <>
struct Fibo<2> {
constexpr static std::size_t value = 1;
};
//Fibo ends
编译器给出参数 1 和 2 无效的错误 这里发生了什么?我该如何解决?
首先,您使用的语法是针对受限类型模板参数,而不是 non-type 具有受限类型的模板参数。所以编译器抱怨它需要一个类型作为模板参数,而不是一个值。
对于具有约束类型的 non-type 模板参数,它应该是 std::unsigned_integral auto num
。
但是 1
和 2
的类型是 int
。它们不是无符号的,您的类型约束正确地拒绝了它们。
1u
和 2u
将是无符号整数并被模板参数接受。
对于具有占位符类型的 non-type 模板参数,不仅提供 value,而且提供 type,意义重大。
看起来好像您真的希望类型是 std::size_t
,而不是任何无符号整数。所以也许只是将其用作 non-type 模板参数的类型而不是约束。