2017-09-22 17 views
2

私は上の位置または下の位置のいずれかのパーティクルのチェーンをシミュレートしたいと思います。この目的のために、私はビットセットから継承するクラスを作った。このようなオブジェクトは、特定の長さを使用してインスタンス化されると派生クラスのメンバ関数はテンプレート引数を気にしません

#include <bitset> 
using namespace std; 

template <size_t N> 
class State : public bitset<N> { 
public: 
    State<N>(); 
    State<N>(size_t b); 

    long int E(); 
private: 
    size_t length; 
}; 

template<unsigned long N> 
State<N>::State() 
    : std::bitset<N>(), length(N) 
{} 

template<unsigned long N> 
State<N>::State(size_t b) 
    : std::bitset<N>(b), length(N) 
{} 

、私はこのようなオブジェクトに関連するエネルギーを見つけるしたいと思います:それは次のようになります。私は、これはコンパイラがE()が原因不足しているテンプレート引数に私のクラスのメンバ関数であることを認識していないことを意味すると理解エラー

state/state.cc:3:10: error: ‘template<long unsigned int N> class State’ used without template parameters 
long int State::E(){ 
      ^~~~~ 
state/state.cc: In function ‘long int E()’: 
state/state.cc:5:27: error: ‘length’ was not declared in this scope 
    for (size_t i = 1; i != length; ++i) 
          ^~~~~~ 
state/state.cc:6:11: error: ‘test’ was not declared in this scope 
    e += (test[i] == test[i - 1]) ? 1 : -1; 
      ^~~~ 

を受け、この

#include "state.h" 

long int State::E(){ 
    long int e = 0; 
    for (size_t i = 1; i != length; ++i) 
    e += (test[i] == test[i - 1]) ? 1 : -1; 

    return e; 
} 

をしたいです。しかし、State<20>オブジェクトでs.E()と呼ぶことができる方法があることを期待していました。したがって、オブジェクトがインスタンス化されると、サイズを再度指定することなくE()を呼び出すことができるようになりたいと思います。これは可能ですか?前もって感謝します!

+2

最初のエラーを修正する必要があります。コンストラクタの定義方法を見てください。メンバー関数についても同じことをする必要があります。 – NathanOliver

+3

また、[this](https://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file)が適切かもしれません。 – NathanOliver

+0

コメントありがとう!分かりました。私は答えとして書くように自由に感じてください。 – Slugger

答えて

2

2つの問題がここにあります:クラステンプレートState<N>のメンバ関数E()を定義し、依存基底クラスbitset<N>test()メンバ関数にアクセスします。

template<size_t N> 
long int State<N>::E(){ 
    long int e = 0; 
    for (size_t i = 1; i != length; ++i) 
    e += (this->test(i) == this->test(i - 1)) ? 1 : -1; 
} 

注両方template<size_t N>State<N>ならびにtestの前にthis->。詳細な説明は、this Q&Aを参照してください。

最後の注意:また、test()(かっこ)とoperator[](角括弧)はstd::bitsetであることに注意してください。

+1

答えをありがとう! – Slugger

1

tempalteクラスのメンバ関数の定義では、コンストラクタの場合と同じようにテンプレートパラメータを指定する必要があります。

この変更によっても、「長さが宣言されていません」というエラーが修正されるはずです。

template <size_t N> 
long int State<N>::E(){ 
    long int e = 0; 
    for (size_t i = 1; i != length; ++i) 
    e += (test(i) == test(i - 1)) ? 1 : -1; 

    return e; 
} 
+0

はコンパイルされず、 'this->' – TemplateRex

+0

が必要です(少なくともVS 2013でコンパイルされますが、確かにtest()はビットセットのメソッドであり、[]ではなくwith()で使用する必要があります。私は変更を行った – Actarus

+0

@Actarus VSは2つのフェーズの名前の検索を実装していない –

関連する問題