2011-07-26 4 views
1

パラメータの1つがbitset<size>であるC++でクラスを作成したいと思います。 私は、そのクラスのどのオブジェクトでもこの "サイズ"を変える機能を与えたいが、そのオブジェクトに対しては一定でなければならない。引数ビットセットを持つ<class_name>の問題

私は変数const int size;を作成し、コンストラクタでそれを初期化した場合bitset<size>をwrititingにクラスのすべてのオブジェクトに対して、それは同じになるだろうどの静的であるとsizeを必要とするので、それはコンパイルされません。

クラステンプレートを作成し、サイズをclassname<size>として渡す以外の方法はありますか?

ありがとうございますが、これは、このFooクラスのオブジェクトをコンポジション(データメンバーとしてのオブジェクト)として使用するときはいつでも...そのクラステンプレートを再度作成する必要があります。私はクラスを作成し、(#define BIT_SIZE 16をFooビットに渡しました;)Foo <> :: Foo()に定義されていないコンパイルエラーを出しています。ここで、Foo()はコンストラクタです。コンパイル時にも動作するはずだと思いました。私はちょうどサイズBIT_SIZEビットを作りたいと思っていました。私は私の "次のレベル"クラスのテンプレートを作る必要がありますか?これらのエラーは他の間違いのためであった可能性があります。しかし、私はそれを何度もチェックしました。


はい先生、私はそれを実装しますが、私は、CPPファイルにこれらを変更したときにヘッダファイルとcppのないファイルを..........含まれている...複数の宣言エラーが来ました。私はLinuxのubuntu ..に取り組んでいます。私はこれらのファイルをWindowsのdev_cppに取り込んでいました。コンパイラが自動的に行う必要があることが原因である可能性があります。それで私は何をする必要があるのですか?

+0

あなたの質問にはどのような話がありますか?あなたは誰に返信していますか? –

答えて

1

いいえ、他の方法が存在しません、 bitset<N>の実際のインスタンス化のコードはコンパイル時に生成されるため、実行時までサイズを提供することはできません。非タイプのテンプレートパラメータを使用する必要があります。

可能であれば、標準のC++ライブラリの作成者がこれを行い、実行時にbitsetのサイズを指定することは可能でしょうか?

別のビットセットの実装を使用することはオプションです。

1

bitsetメンバーを使用するには、あなたがsizeテンプレートパラメータを作成し、メンバーにそれを使用する必要があります。

template <size_t N> 
class Foo 
{ 
    std::bitset<N> thebitset; 

public: 
    Foo() /* ... */ 
}; 

を次にそれを使用して、Foo<12> x;を言います。代替のためのあなたの質問に鑑み

、あなたは静的なものの代わりに、ランタイム・動的配列を使用することができます。

class Bar 
{ 
    std::vector<unsigned char> thedata; 

public: 
    explicit Bar(size_t n) : thedata(n, 0) { } 

    inline unsigned char & operator[](size_t i) { return thedata[i]; } 
    inline const unsigned char & operator[](size_t i) const { return thedata[i]; } 
}; 
+0

ありがとうございました。使用するのは大丈夫です。これは、このFooクラスのオブジェクトをコンポジション(データメンバとしてのオブジェクト)として使用するときはいつでも...そのクラステンプレートを再度作成する必要があります。私はクラスを作成し、Foo ビットに#define BIT_SIZE 16を渡しました;)Foo <16> :: Foo()への未定義のコンパイルエラーがコンパイルエラーです。ここで、Foo()はコンストラクタです。コンパイル時にも動作するはずだと思いました。私はちょうどサイズBIT_SIZEビットを作りたいと思っていました。私は私の "次のレベル"クラスのテンプレートを作る必要がありますか?これらのエラーは他の間違いのためであった可能性があります。しかし私は –

+0

を確認しました。FooのBITS_SIZEにデフォルト値を指定しました。

+0

"undefined refrence"はコンパイル時エラーではなく、リンカーエラーです。コンストラクタを実装しましたか? –

2

テンプレートパラメータは一定の時間をコンパイルする必要があります。コンパイラは異なるサイズのパラメータに対して異なるクラスを生成します。あなたが使用可能な様々なサイズの単一ビットセットクラスを使用する場合は、例えば、dynamic_bitsetブースト:

http://www.boost.org/doc/libs/1_47_0/libs/dynamic_bitset/dynamic_bitset.html

をし、コンストラクタのパラメータとしてビットセットのサイズを渡す

+0

クイック返信のおかげで.. –

関連する問題