2011-01-31 3 views
2

Je reçois une erreur de compilation de:erreur du compilateur n'a pas de sens (erreur paramètre manquant à la fonction)

erreur: aucune fonction de mise en correspondance pour l'appel à buildTransFunc(<unresloved overloaded function type>, boost::function<EnumType(short int)>, EnumTypeToStringTranslator&)

La déclaration de buildTransFunc est la suivante :

template<typename RT, typename func, typename... Args> 
RT buildTransFunc(func f, Args... args) 
{ 
    return RT(boost::bind(f, _1, args...)); 
} 

J'appelle ci-dessus comme suit:

typedef boost::function<std::string (short int)> toASCIITranslator; 
toASCIITranslator temp = buildTransFunction<toASCIITranslator, std::string (*) (short int, boost::function<EnumType(short int)>, EnumTypeToStringTranslatorType&), boost::function<EnumType(short int)>, EnumTypeToStringTranslatorType& > 
(&Translator<std::string, forward_trans, short int, boost::function<EnumType (short int)>, EnumTypeToStringTranslatorType>, boost::function<EnumType(short int)(&enumChecker), EnumTypeToStringTranslator); 

Le message d'erreur semble ignorer le paramètre std :: string (*) (short int, boost :: function, EnumTypeToStringTranslatorType &) dans le message d'erreur, tout le reste étant présent. J'utilise GCC 4.5.2 pour le compilateur.

La déclaration de la fonction Traducteur est:

template<typename RT, typename D, typename... Args> 
RT Translator(Args... args) 
{ 
    return static_cast<RT>(translate<RT, D>(args...)); 
} 

Les fonctions de traductions se trouvent dans cette question: Translate

EDIT appel corrigé buildTransFunction pour terminer les paramètres de specifing.

g ++ arguments utilisés: -std = C++ 0x.

+1

Vous utilisez une (liste d'arguments de modèle variable) fonction C++ 0x. Avez-vous dit au compilateur de compiler C++ 0x? –

+0

oui, j'ai ajouté le -std = C++ 0x à la liste des arguments pour le compilateur. – diverscuba23

+0

Vous devez avoir un code bizarre. Pourquoi est-ce que '& enumChecker' vous donne un' boost :: function <> '? Aussi, où avez-vous déclaré 'f'? Tout cela ne ressemble pas à du vrai code. Nous avons aussi besoin de la déclaration de 'Traducteur'. –

Répondre

1

Je suppose que la morale de cette question est de ne pas essayer d'être trop sophistiqué ... comme cela fonctionne par appelant clairement boost :: bind avec les paramètres, au lieu de les transmettre par une fonction de séparation.

donc au lieu de ceci:

toASCIITranslator temp = buildTansFunc<.....>(....); 

juste faire l'appel comme ceci:

toASCIITranslator temp = boost::bind(&Translator<std::string, forward_trans, short int, boost::function<EnumType(short int), EnumToStringTranslatorType&>, 
         _1, 
         boost::function<EnumType(short int)>(&enumChecker), 
         EnumToStringTranslator);