Const接收一个var,它不能传递给模板
Const receiving a var, i cant pass it to a template
我想做的是:
int const bitsPerInt = log2(X);
bitset<bitsPerInt> bits(a random number...);
但是我得到这个错误:
'bitsPerInt'不能出现在常量表达式中错误:模板参数1无效
如果你真的需要它工作,你可以自己制作一个在编译时工作的log2
,并把它传递给bitset的模板参数。
constexpr unsigned Log2(unsigned n, unsigned p = 0) {
return (n <= 1) ? p : Log2(n / 2, p + 1);
}
constexpr size_t bitCount = Log2(X);
std::bitset<bitCount> bits;
生活例子。
这是使用模板元编程的解决方案,即不使用constexpr
:
template<int N,unsigned int P=0>
struct Log2 { enum { value = Log2<N/2,P+1>::value }; };
template <unsigned p>
struct Log2<0, p> { enum { value = p }; };
template <unsigned p>
struct Log2<1, p> { enum { value = p }; };
std::bitset<Log2<4>::value> bits;
生活例子。
这个版本应该可以在c++ 03和c++ 11中工作;然而,如果你已经访问了c++ 11,我仍然推荐constexpr
方式,因为它更干净(更容易理解)。
模板参数需要在编译时被知道(如果它是值而不是类型则是常量)。这就是模板在c++中的工作方式。模板实际上为每个特定版本的泛型代码生成真实的代码。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的for循环不能正确获取argv
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么模板类中的对象不能返回值
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 数组长度,为什么从命令行获取时不能使用它?
- Windows/Cygwin - 不能使用 pybind11 - 犯错误
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 为什么我不能将 rand() 与数组的大小一起使用?
- 为什么虚函数不能是静态的和全局的?
- 为什么我不能在 while 循环中创建线程?
- 为什么这个音频包络不能通过开关的情况?
- Const接收一个var,它不能传递给模板