2016-11-20 1 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オブジェクトの間に混乱が生じています。 'const'はオブジェクトを変更不可能にするためのもので、' constexpr'はコンパイル時に値を利用可能にするためのものです。 –

答えて

0

はconst_castは何かのconstをしないようにconstの離れをキャストするために使用されます。あなたは、ポストC++ 11のプログラミングで最も簡単な方法は、constexprのを使用することである定数式したい場合:

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

をあなたが何かを把握しなければならないので、ユーザからの入力は、コンパイル時定数式にすることはできません。

+0

'const_cast'を使って**を削除したり、** constを追加することができます。 'const'の追加は、場合によっては暗黙的に行うこともできますが、' const_cast'が必要な場合もあります。しかし、実行時の値をコンパイル時定数に変えないということは正しいです。興味深い; –

+0

;私はそれを覚えています。私はそれを逆にしなければならなかった。ヘッドアップをありがとう。 – SnappleLVR

0

テンプレートはコンパイル時に展開されます。つまり、コンパイル時にすべてのテンプレート引数を認識する必要があります。明らかに、ユーザー入力は実行時データなので、テンプレート引数として使用することはできません。

0

他の人が述べたように、実行時にテンプレートパラメータを推論することはできません。
ブーストのdynamic bitsetを調べてみる必要があります。
あなたが遭遇した正確な問題のために存在します。

「はdynamic_bitsetクラスのstd ::ビットセットとほぼ同一であるクラス。差はdynamic_bitset( ビット数)のサイズが の構築中に実行時に指定されていることを dynamic_bitsetオブジェクトですが、std :: bitsetのサイズは整数テンプレートパラメータでコンパイル時に と指定されています。

関連する問題