std::tr1::function et std::tr1::bind

J'ai un problème à l'aide d'un très compliqué C de la fonction dans une classe C++ (réécriture de la fonction C est pas une option). Fonction C:

typedef void (*integrand) (unsigned ndim, const double* x, void* fdata,
                           unsigned fdim, double* fval);
//This one:
int adapt_integrate(unsigned fdim, integrand f, void* fdata,
                    unsigned dim, const double* xmin, const double* xmax, 
                    unsigned maxEval, double reqAbsError, double reqRelError, 
                            double* val, double* err);

J'ai besoin d'une fonction void de type integrand moi-même, et adapt_integrate de calculer le n-dimensionnelle partie intégrante. Le code de la calcTripleIntegral (ci-dessous) fonctionne comme une fonction autonome si func est une fonction autonome).
Je veux passer une (non-statique!) fonction membre de classe que la fonction à intégrer, comme cela peut être facilement surchargé etc...

class myIntegrator
{
public:
    double calcTripleIntegral( double x, double Q2, std::tr1::function<integrand> &func ) const
    {
        //...declare val, err, xMin, xMax and input(x,Q2) ...//
        adapt_integrate( 1, func, input,
                         3, xMin, xMax,
                         0, 0, 1e-4,
                         &val, &err);
        return val;
    }
    double integrandF2( unsigned ndim, const double *x, void *, //no matter what's inside
                 unsigned fdim, double *fval) const;            //this qualifies as an integrand if it were not a class member
    double getValue( double x, double Q2 ) const
    {
        std::tr1::function<integrand> func(std::tr1::bind(&myIntegrator::integrandF2, *this);
        return calcTripleIntegral(x,Q2,func);
    }
}

Sur GCC 4.4.5 (version préliminaire), cela me donne:

erreur: la variable 'std::tr1::function func' a l'initialiseur mais incomplète type

MODIFIER:Quelle est l'erreur dans mon code? Maintenant, j'ai essayé de compiler avec GCC 4.4, 4.5 et 4.6, le tout résultant dans la même erreur. Soit aucun travail n'a été effectué sur ce, ou j'ai fait quelque chose de mal /MODIFIER

Grâce très beaucoup! Si je ne suis pas assez clair, je serai heureux d'élaborer.

PS: Pourrais-je contourner ce sans tr1 trucs à l'aide d'un pointeur de fonction à une fonction définie quelque part dans myIntegrator.cpp?

Dernière mise à JOUR: ok, j'ai eu tort de penser TR1 fourni un/deux-solution en ligne pour cela. La poisse. Je suis à la "conversion" de mes classes d'espaces de noms et copypasting les déclarations de fonction. J'ai seulement besoin d'une classe de base et une sous-classe qui ré-implémenté l'interface. C pointeur de fonction + C++ class = mauvaise nouvelle pour moi.
Merci de toute façon pour toutes les réponses, vous avez de me montrer quelques coins sombres de C++ 😉

Le C++0x caractéristiques?
Quelles sont les fdata et input paramètres? Pourquoi ne pas le void* paramètre dans la fonction à intégrer tapez un nom?
Caspin, vous n'avez pas besoin de nommer les paramètres d'une fonction dans une déclaration de type. Vous n'avez même pas besoin de les nommer dans la définition même de la fonction si vous n'avez pas besoin de les utiliser dans la fonction. Les gens l'habitude d'écrire ce si leur fonction doit correspondre à une certaine signature pour une utilisation avec un autre code, mais certains paramètres ne seront jamais utilisés dans leur mise en œuvre.
Caspin sait que. Le problème est que nous ne savons pas si void* fdata est passé par - si le void* paramètre pour integrand a été bien nommé, nous n'aurions pas à deviner/ask.
Ah! Je suis bête! J'ai confondu une question de premier plan pour une véritable ignorance. Désolé Caspin!

OriginalL'auteur rubenvb | 2010-07-15