2016-04-12 3 views
-1

ビットの配列(メンバー変数として)を含むC++テンプレートクラスを作成しようとしています。ビット配列のサイズはコンパイル時にわかっていますので、実際にはstd::bitsetであることが欲しいですが、関数をに設定するのは難しいです。ビットを設定してください。C++でビット配列を実装する方法

例えば、私はこのような何かを開始するために私のクラスを希望:

template<size_t N> 
class bitvector 
{ 
public: 
    bool operator[](size_t i) const { return bits[i]; } 
    bool& operator[](size_t i) { return bits[i]; } 
private: 
    std::bitset<N> bits; 
}; 

ゲッターは大丈夫動作します。問題は、std::bitset::operator[]セッター関数がstd::bitset::referencebool&ではなく)自身をテンプレート化して返すことです。私は、テンプレートと、あまりにも経験していないんだけど、次の試みは失敗しました:

template<size_t K> 
std::bitset<K>::reference operator[](size_t i) { return bits[i]; } 

次のエラーneed 'typename' before 'std::bitset<K>::reference' because 'std::bitset<K>' is a dependent scopeで。私はいくつかのグーグルを試みたが、役に立たなかった。

std::bitsetはこのタスクに適したツールですか?もしそうなら、私はどのようにセッター機能を書くことができますか?そうでない場合は、代わりに何を使用できますか? (私はまだビットとして実際に格納されていると、std::vector<bool>は、配列のサイズをコンパイル時に厳密に固定したいので、かなり正しいとは思われません)。

+2

わかりません。 'std :: bitset'は' operator [] 'を持っています(http://en.cppreference.com/w/cpp/utility/bitset/operator_at)。なぜあなたはなぜホイールを再発明していますか? –

+3

エラーは自明です。 'typename before ... 'を追加してください。それで、なぜあなたはそれをやろうとしないのですか? –

+0

@ThomasMatthews:問題を示すために、おそらくより大きいクラスの最小限のバージョンです。 – Unimportant

答えて

2

あなただけの、次のようにstd::bitset<N>::referenceを返すことができます:あなたはNを望むあなたはまだ元のテンプレートパラメータNにアクセスすることができますので、追加のtemplate<size_t K>を持ってする必要はありません、いかなる場合であっても

template<size_t N> 
class bitvector 
{ 
public: 
    bool operator[](size_t i) const { return bits[i]; } 
    typename std::bitset<N>::reference operator[](size_t i) { return bits[i]; } 
private: 
    std::bitset<N> bits; 
}; 

とあなたKは違う。

::referenceが値ではなく型であることをコンパイラに伝えるには、関数の戻り値の型の前にtypenameが必要です。例えば

:ここ

struct Foo{ 
    typedef int reference; 
}; 

struct Bar{ 
    static int reference; 
}; 

Foo::referenceはタイプですが、Bar::referencetypenameのない、それはstd::bitset<N>::referenceが可変であることが考えられてコンパイラは文句を言う戻り値の型の前に、変数です。 (コンパイラは、値ではないが何らかの理由でそれが必須であることを理解するために必要なすべての情報を持っている必要があります)。

+0

偉大な答え。とても説明してくれてありがとう。 – Harry