2016-11-20 458 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的大小在編譯時通過整數模板參數指定爲 。「