我想在向上位置或向下位置模拟一串粒子。为此我创建了一个继承自bitset的类。它看起来像:
#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)
{}
一旦使用一定长度对这样的对象进行实例化,我想找到与这样一个对象相关的能量。我想这样做
#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/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;
^~~~
我理解这意味着由于缺少模板参数,编译器无法识别E()
是我的类的成员函数。但是,我希望有一种方法可以在s.E()
对象上调用State<20>
。因此,一旦对象被实例化,我希望能够调用E()
而无需再次指定大小。这可能吗?提前谢谢!
答案 0 :(得分:2)
这里有两个问题:定义类模板E()
的成员函数State<N>
,以及访问依赖基类的test()
成员函数 bitset<N>
。
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>
以及this->
前面的test
。有关详细说明,请参阅this Q&A。
最后注意事项:同样要小心:test()
中的operator[]
(括号)和std::bitset
(括号)。
答案 1 :(得分:1)
在tempalte类的成员函数定义中,必须像对构造函数那样指定模板参数。
错误“lenght not declared”也应该通过此更改来修复。
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;
}