类对象的模板

时间:2017-11-21 13:58:46

标签: c++ class templates initialization

我写了一个类,看起来如下:

template <typename Function, class RNG>
class Langevin{
public:
   Langevin(RNG & gen_, Function & force_, vector & qp_)
   : gen(gen_),force(force_),qp(qp_){}

    void ABO(const int T){
        for(int t=0; t<T;++t){
            ABO_step();
        }
    }

private: 
void ABO_step(){...}

vector & qp;
RNG & gen;
Function & force;
};

并构建了一个类对象并调用了成员函数:

int main(){
... 
vector qp_sl;
qp_sl.reserve(T+1);
qp_sl.push_back({0.0,0.1});
auto harmonic_force=[](double q){return -q;};
Langevin<decltype(harmonic_force), std::default_random_engine> sl_scheme(gen,harmonic_force, qp_sl);
sl_scheme.ABO(T);

现在我收到了错误消息:

‘Langevin<main()::<lambda(double, double)>, std::linear_congruential_engine<long unsigned int, 16807ul, 0ul, 2147483647ul> >::force’ will be initialized after [-Wreorder] Function & force;

我过度训练,错误是什么?

1 个答案:

答案 0 :(得分:4)

编译器试图告诉您,数据成员force将在qp之后初始化,即使它出现在member initializer listqp之前。

请注意,数据成员始终按其声明的顺序初始化。

  

然后,按照类定义中的声明顺序初始化非静态数据成员。

你应该让它们相同,以避免这种混淆。

Langevin(RNG & gen_, Function & force_, vector & qp_)
: qp(qp_), gen(gen_), force(force_) {}