类对象的模板

Template for class objects

本文关键字:对象      更新时间:2023-10-16

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

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;

我太过了,错误是什么?

编译器试图告诉您,即使在 qp之后,数据成员force也将在成员初始化器列表中出现在qp之前。

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

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

您应该使它们相同以避免这种困惑。

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