派生类的成员函数不关心模板参数

时间:2017-09-22 12:59:53

标签: c++ templates inheritance

我想在向上位置或向下位置模拟一串粒子。为此我创建了一个继承自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()而无需再次指定大小。这可能吗?提前谢谢!

2 个答案:

答案 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;
}