2016-11-20 456 views
0

我想将一个非常量变量转换为常量变量。我尝试使用const_cast,但仍然下面的程序给出'bitsize1'不能出现在常量表达式中的错误。我究竟做错了什么 ?C++:非常量转换为常量

#include <string> 
#include <bitset> 
#include <iostream> 
using namespace std; 
int main(){ 

int l = 3; // taken input from user 
int bitsize2 = (l * 2); 

int bitsize1 = const_cast<int&>(bitsize2); 
string temp = "100101"; 
bitset<const_cast<int&>(bitsize2)> baz (temp); 
cout << baz; 
return 0; 

} 
+1

在编译时必须知道模板参数。 –

+1

您在常量表达式和常量对象之间感到困惑。 'const'用于使对象不可修改,'constexpr'用于在编译时使值可用。 –

回答

0

const_cast会被用于铸造常量不会使一些常量。如果你想常量表达式在后C++编程11最简单的方法是使用constexpr:

constexpr int l = 3; 
constexpr int bitsize2 = l * 2; 

来自用户的输入可以不是一个编译时间常数表达式,所以你必须想出别的东西。

+0

'const_cast'可以用来删除**或者添加**'const'。在某些情况下添加'const'可以隐式完成,但也有需要'const_cast'的情况。不过,你是对的,它不会将运行时值转化为编译时常量。 –

+0

有趣;我将在未来记住这一点。我从来没有反过来做过。谢谢你的头。 – SnappleLVR

0

模板在编译时展开,这意味着编译时应该知道所有的模板参数。显然,用户输入是运行时数据,因此不能用作模板参数。

0

如其他人所述,您不能在运行时推导出模板参数。
你应该看看使用boost的dynamic bitset
它存在您遇到的确切问题。

“dynamic_bitset类几乎相同的std :: bitset的类。 的差别是一个 施工时在运行时指定是来,dynamic_bitset(的 比特的数量)的大小dynamic_bitset对象,而std :: bitset的大小在编译时通过整数模板参数指定为 。“