私は上の位置または下の位置のいずれかのパーティクルのチェーンをシミュレートしたいと思います。この目的のために、私はビットセットから継承するクラスを作った。このようなオブジェクトは、特定の長さを使用してインスタンス化されると派生クラスのメンバ関数はテンプレート引数を気にしません
#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()
を呼び出すことができるようになりたいと思います。これは可能ですか?前もって感謝します!
最初のエラーを修正する必要があります。コンストラクタの定義方法を見てください。メンバー関数についても同じことをする必要があります。 – NathanOliver
また、[this](https://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file)が適切かもしれません。 – NathanOliver
コメントありがとう!分かりました。私は答えとして書くように自由に感じてください。 – Slugger