| // { dg-do assemble } |
| // Gets ICE 40. |
| |
| #include <vector> |
| #include<string> |
| #include <iostream> |
| |
| using namespace std; |
| |
| class ODEsolver |
| { |
| private: |
| void eulerODE(vector<double>& y, double& t, double& dt); |
| void midpointODE(vector<double>& y, double& t, double& dt); |
| |
| protected: |
| void (ODEsolver::*useMethod)(vector<double>&, double&, double&); |
| void init(); |
| |
| public: |
| ODEsolver(); |
| void timeloop(vector<double>& y, double ts, double te, double dt); |
| }; |
| |
| |
| ODEsolver::ODEsolver() |
| { |
| init(); |
| } |
| |
| |
| void ODEsolver::eulerODE(vector<double>& y, double& t, double& dt) |
| { |
| y[0] = dt * 2.; |
| } |
| |
| void ODEsolver::midpointODE(vector<double>& y, double& t, double& dt) |
| { |
| y[0] = dt * 3.; |
| } |
| |
| |
| |
| void ODEsolver::init() |
| { |
| ODEsolver::useMethod = &ODEsolver::midpointODE; |
| } |
| |
| void ODEsolver::timeloop(vector<double>& y, double ts, double te, double dt) |
| { |
| (ODEsolver::useMethod)(y,ts,dt); // { dg-error "" } should use this->* |
| } |
| |
| int main (int nargs, char** args) |
| { |
| ODEsolver solver; |
| vector<double> y(2); double t_start=5.; double t_end=7.; double dt=2.; |
| solver.timeloop(y,t_start,t_end,dt); |
| cout << y[0] << endl; |
| return(0); |
| } |