Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Const收到一个var,我无法将其传递给模板_C++ - Fatal编程技术网

C++ Const收到一个var,我无法将其传递给模板

C++ Const收到一个var,我无法将其传递给模板,c++,C++,我想做的是: int const bitsPerInt = log2(X); bitset<bitsPerInt> bits(a random number...); int const bitsprint=log2(X); 位集位(随机数…); 但我得到了这个错误: “BitsPrint”不能出现在常量表达式中 错误:模板参数1无效 模板参数需要在编译时已知(如果是值而不是类型,则为常量)。这就是模板在C++中的工作方式。模板实际上会为每个特定版本的通用代码生成真实的代码。如

我想做的是:

int const bitsPerInt = log2(X);
bitset<bitsPerInt>  bits(a random number...);
int const bitsprint=log2(X);
位集位(随机数…);
但我得到了这个错误:

“BitsPrint”不能出现在常量表达式中 错误:模板参数1无效


模板参数需要在编译时已知(如果是值而不是类型,则为常量)。这就是模板在C++中的工作方式。模板实际上会为每个特定版本的通用代码生成真实的代码。

如果确实需要这样做,请创建自己的在编译时工作的
log2
,并将其传递给位集的模板参数

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;


这个版本应该可以在C++03和C++11中使用;但是,如果您可以访问C++11,我仍然建议使用
constepr
方法,因为它更干净(更容易理解)。

使用
std::vector
log2(X)可以在编译时知道吗?可能重复:错误很明显
BitsPrint
是一个常量,但不是一个常量表达式aka
constexpr
我想模板元编程也有一种方法,但我还没有完全做到。尽管如此,这是一个不错的解决方案。是的,如果你没有访问C++11的权限,那么元编程也可以这样做。有一种方法可以做到这一点,而不需要使用constexpr吗?因为它是c++11,除此之外,我还不熟悉constexpr。。。谢谢你的帮助@埃里克福廷:那里!添加了元编程版本,因为OP要求它:)@ViperAlpha:我也添加了这个案例,但它需要您了解一点元编程。两者都只在编译时工作;如果你真的有
X
的变量值,那么
bitset
不适合你,你应该使用
vector
。是的,我知道,但问题是,它的变量,没有办法做到这一点?使用模板和运行时值,没有。
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;