2016-12-02 40 views
0

我想知道如何去使用變量來設置一個位集的大小。例如,使用變量來設置位集的大小

// obtain file size: 
fseek (rFile , 0 , SEEK_END); 
numberOfBytes = ftell (rFile); 
rewind (rFile); 

const unsigned long long buffSize = numberOfBytes * 8; 
std::bitset<buffSize> buffer; 

我收到一條錯誤消息,指出buffSize的值在常量表達式中不可用。我正在尋找一種方法將bitset設置爲我正在閱讀的任何文件的大小。

+3

不能使用變量作爲模板參數,也不能使用非常量變量來初始化常量變量。這是一個殘酷的世界,但你不得不吞下去。 –

+0

如果不告訴它一個常量值,編譯器如何知道如何確定這個東西的大小?一些標準庫容器在編譯後可以任意調整大小,其他的則不可以。仔細閱讀文檔以瞭解其差異。 – tadman

+0

可能你可以用'std :: vector '下車,這是一個糟糕的解決方案。 –

回答

5

這是無法完成的。 std:bitset的大小是一個模板參數,所以它必須是編譯時常量。

能/可以工作幾個選擇是:

  1. 設置上限的大小,使用大小的bitset,只是忽略額外位。
  2. 切換到std::vector<bool>。這有一些警告,但提供了與bitset大致相似的基本功能。
  3. 切換到提升dynamic_bitset。這將使您可以將大小指定爲ctor的參數,而不是模板參數,因此它不需要是編譯時常量。

毫無疑問,當然有其他的可能性。就我個人而言,我的第一選擇可能是Boost dynamic_bitset

0

你不能,大小需要在編譯時被稱爲

3

有兩種不同類型的常量,編譯時間常數和其他一切聲明const。在你的代碼中你有後者。即使它被聲明爲const,它也會被直到運行時才知道的數據初始化,所以它不是一個編譯時間常量。

std::bitset需要用編譯時間常量來定義。由於你沒有編譯器會給你一個錯誤。如果你需要在運行時定義一個bitset,我會建議boost::dynamic_bitset