对 '(const Y) (int&, std::mersenne_twister_engine<long unsigned int,

no match for call to ‘(const Y) (int&, std::mersenne_twister_engine<long unsigned int,

本文关键字:int engine twister lt long unsigned mersenne std const      更新时间:2023-10-16

有我的.hpp :

#include <random>
#include <ctime>
#include <cmath>
#ifndef RECUIT_HPP
#define RECUIT_HPP


template < class E, class Func, class TempSeq, class RandomY, class RNG>
E recuit_simule(const Func & phi, E x0, const TempSeq & T, const RandomY & Y, RNG & G, long unsigned N) {
std::uniform_real_distribution<double> U(0,1);
E y;
double u;
for(int i=0; i<N; i++) {
y=Y(x0, G);
u=U(G);
if(u <= fmin(1, exp((phi(x0) - phi(y))/T(N)))) {
x0=y;
}
}
return x0;
}
#endif

和我的.cpp:

#include "recuit.hpp"
#include <iostream>
class Y {
private:
std::normal_distribution<double> N;
public:
Y() : N(0,1) {}
double operator()(const double & x, std::mt19937 & G) { return x + N(G); }
};

int main() {
auto phi=[](const double & x) { return x*x*x*x*x*x - 48*x*x; };
auto T=[] (long unsigned n) { return 10 * pow(0.9, n); };
Y A;
std::mt19937 G;
double x = recuit_simule(phi, 0, T, A, G, 1000);
std::cout << x << std::endl;
return 0;
}

当我编译.cpp时,我的.hpp中有以下错误:

recuit.hpp:17:6:错误:对"(const Y( (int&, std::mersenne_twister_engine&('

对于行:

y=Y(x0, G);

我不明白为什么

Y::operator()不是const,所以你不能在 const 对象上调用它。因此,使参数Y可变的:

E recuit_simule(const Func & phi, E x0, const TempSeq & T, RandomY & Y, RNG & G, long unsigned N) {
//                                                         ^~~~~~~~~~~
//                                                         not const

旁注:您的代码非常混乱且难以阅读,因为您没有对类型和变量使用不同的表示法。 例如Y既是类型,也是参数的名称。而且你不一致:有时变量是小写的,有时是大写的。