Правильное определение явного конструктора по умолчанию с аргументами enum и template - PullRequest
0 голосов
/ 06 мая 2020

У меня есть базовый класс Method с подклассами.

auto harmonic_force = [](const double& q, const double& k){return -k*q;};
enum SplittingAB{ SS,L42 };

class Method
{
public:
    ~Method() = default;
    virtual void evolute( std::vector<std::pair<double,double>> &qp, int T) const = 0;
};


template <typename Function>
class MiddleO : public Method{
public:
    MiddleO() = default;
    explicit MiddleO(SplittingAB mmo_=SS, const double& a_=-1.0, const double& b_=1.0, const Function& force_=harmonic_force, const double& k_=1.0, const double& gamma_=1.0, const double& kBT_=1.0);

    void evolute( std::vector<std::pair<double,double>> &qp,  int T) const override;

    std::string get_name(SplittingAB m) const {
        switch (m){
            case SplittingAB:: SS:{
                return "MethodsMiddleO_SS";
            }
            case SplittingAB ::L42:{
                return "MethodsMiddleO_L42";
            }
        }
    }
private:
    SplittingAB  mmo;
    const double k{}, gamma{}, kBT{}, a{}, b{};
    double L = 1.0;
    Function&  force;
};

Мое определение конструктора следующее:

template<typename Function>
MiddleO<Function>::MiddleO(SplittingAB mmo_, const double &a_, const double &b_, const Function &force_,
                       const double &k_, const double &gamma_, const double &kBT_)
    : Method(), mmo(mmo_), a(a_), b(b_), force(force_), k(k_), gamma(gamma_), kBT(kBT_) { L=b-a; }
  1. Я получаю сообщение об ошибке binding reference of type ‘<lambda(double, double)>&’ to ‘const<lambda(double, double)>’ discards qualifiers. Я не могу понять, как мне правильно инициализировать силу.
  2. Я также получаю замечание Constructor does not initialize these fields: mmo

РЕДАКТИРОВАТЬ: В моей функции main() я написал:

auto cos_force = [](double q, const double k){return -q*q*q*k - 5.0*cos(1+5.0*q);};
int main(){
     double a = -3.5;
     double b = 3.5;

    double const k = 1.0;
    double const gamma = 1.0;
    double const kBT=1.0;
    std::vector<std::pair<double,double>> qp;
    qp.reserve(T+1);
    qp.emplace_back(0.0,0.1);

    SplittingAB sm = SS;
    MiddleO<decltype(cos_force)> obj(sm, a,  b, cos_force , k, gamma,kBT);
   ...
}

1 Ответ

1 голос
/ 06 мая 2020

Проблема 1

Компилятор правильно сообщает об ошибке, поскольку вы пытаетесь инициализировать Function& с помощью Function const&. Если разрешено, он не сохранит const -носпособность исходного объекта.

Если производительность не является доказанной проблемой для вашего варианта использования, измените

Function&  force;

на

Function  force;

Проблема 2

Добавьте код для инициализации члена.

template<typename Function>
MiddleO<Function>::MiddleO(SplittingAB mmo_, const double &a_, const double &b_,
                           const Function &force_, const double &k_,
                           const double &gamma_, const double &kBT_)
    : Method(), mmo(mmo_), a(a_), b(b_), force(force_), k(k_),
      gamma(gamma_), kBT(kBT_), mmo(SS) { L=b-a; }
                             // ^^^^^^^

Возможно, компилятор жалуется на конструктор по умолчанию.

Кроме того,

MiddleO() = default;

неверно. Это не позволяет инициализировать ссылочный член. Компилятор должен был сообщить об ошибке для этого.

...