Patrick Dupre a écrit :
>
> Bonsoir,
>
> Je remercie tous ceux qui mon repondu avec des suggestions. J'ai essaye
> plusieurs choses et voici comment je redefini le probleme:
>
> Voici l'erreur de compilation que j'ai:
>
>
> Fitter.cpp:418: error: no matching function for call to
> 'ROOT::Minuit2::ModularFunctionMinimizer::ModularFunctionMinimizer(ROOT::Minuit2::RR_Chi2&,
> ROOT::Minuit2::MnUserParameters&, ROOT::Minuit2::MnStrategy&, int, double)'
> /usr/local/include/Minuit2/ModularFunctionMinimizer.h:47: note:
> candidates are:
> ROOT::Minuit2::ModularFunctionMinimizer::ModularFunctionMinimizer()
> /usr/local/include/Minuit2/ModularFunctionMinimizer.h:47: note:
> ROOT::Minuit2::ModularFunctionMinimizer::ModularFunctionMinimizer(const
> ROOT::Minuit2::ModularFunctionMinimizer&)
> Fitter.cpp:418: error: cannot declare variable 'minimizer' to be of
> abstract type 'ROOT::Minuit2::ModularFunctionMinimizer'
> /usr/local/include/Minuit2/ModularFunctionMinimizer.h:47: note:
> because the following virtual functions are pure within
> 'ROOT::Minuit2::ModularFunctionMinimizer':
> /usr/local/include/Minuit2/ModularFunctionMinimizer.h:86: note: virtual
> const ROOT::Minuit2::MinimumSeedGenerator&
> ROOT::Minuit2::ModularFunctionMinimizer::SeedGenerator() const
> /usr/local/include/Minuit2/ModularFunctionMinimizer.h:87: note: virtual
> const ROOT::Minuit2::MinimumBuilder&
> ROOT::Minuit2::ModularFunctionMinimizer::Builder() const
>
> mon interface ModularFunctionMinimizer.h contient:
>
> class ModularFunctionMinimizer : public FunctionMinimizer {
> public:
> virtual FunctionMinimum Minimize(const FCNBase&, const
> MnUserParameters&, const MnStrategy&, unsigned int maxfcn = 0, double
> toler = 0.1) const;
> } ;
>
> que j'instancie par:
>
> ModularFunctionMinimizer minimizer (*fFCN, par, stra, 0, 0.1) ;
>
> avec:
> RR_Chi2 *fFCN ;
> MnUserParameters par ;
> MnStrategy stra (1) ;
>
> ou RR_Chi2 est une classe derivee de FCNBase.
>
> Il semble que je ne puisse utiliser directement une classe derivee dans
> mon intanciation
Bonsoir Patrick,
Pour que tu puisses instancier la classe ModularFunctionMinimizer, il
faut que ce soit une classe *non abstraite*, c'est à dire une classe qui
ne possède aucune fonction virtuelle pure.
Si une classe de base ( ici FunctionMinimizer ) définit ne serait-ce
qu'une fonction pure virtuelle ( autrement dit une fonction virtuelle
dont la déclaration se termine par " = 0;" ), alors les classes dérivées
( ici ModularFunctionMinimizer ) doivent impérativement redéfinir la
fonction en question, sous forme non pure, faute de quoi tu ne pourras
pas les instancier.
Dans le cas présent, ta classe ModularFunctionMinimizer ne définit pas
de fonction virtuelle pure, mais je te suggère de regarder si la classe
FunctionMinimizer n'en définirait pas une, et si c'est le cas, alors il
faut, je pense, la redéfinir dans ModularFunctionMinimizer.
Accessoirement, vérifie aussi que tous tes fichiers d'en-tête sont bien
protégés contre les inclusions multiples ( et les inclusions croisées ),
à l'aide des lignes :
#ifndef MONFICHIER_H
#define MONFICHIER_H
// ...
#endif // MONFICHIER_H
Cela peut paraître surprenant, mais le fait de ne pas le faire peut dans
certains cas provoquer l'apparition des messages que tu rencontres.
HTH,
--
Marc