2010-04-02 4 views
4

comprennent

#include <functional> 

using namespace std; 

int main() { 
    binary_function<double, double, double> operations[] = { 
    plus<double>(), minus<double>(), multiplies<double>(), divides<double>() 
    }; 
    double a, b; 
    int choice; 
    cout << "Enter two numbers" << endl; 
    cin >> a >> b; 
    cout << "Enter opcode: 0-Add 1-Subtract 2-Multiply 3-Divide" << endl; 
    cin >> choice; 
    cout << operations[choice](a, b) << endl; 
} 

et l'erreur que je reçois est:std :: binary_function - aucune correspondance pour l'appel?

Calcy.cpp: In function ‘int main()’: 
Calcy.cpp:17: error: no match for call to ‘(std::binary_function<double, double, double>) (double&, double&)’ 

Quelqu'un peut-il expliquer pourquoi je reçois cette erreur et comment se débarrasser de lui?

Répondre

6

std::binary_function contient uniquement typedefs pour les types argument et return. Il n'a jamais été prévu d'agir comme une classe de base polymorphe (et même si c'était le cas, vous auriez encore des problèmes avec le découpage).

Comme alternative, vous pouvez utiliser boost::function (ou std::tr1::function) comme ceci:

boost::function<double(double, double)> operations[] = { 
    plus<double>(), minus<double>(), multiplies<double>(), divides<double>() 
}; 
+0

Pourquoi ne pas le drapeau du compilateur une erreur sur la première ligne de 'main()'? Si cette définition de tableau est autorisée, les appels aux fonctions stockées dans le tableau doivent l'être également. Pourquoi cette erreur alors? –

+5

Il fait juste ce que vous avez besoin de faire. 'binary_function' (ou ce qui importe pour tout autre type dans la bibliothèque standard) ne mérite pas un traitement spécial de la part du compilateur. Puisque 'plus' ... hérite de' binary_function', l'affectation est correcte et vous obtenez un découpage. Le compilateur ne parvient pas à compiler la dernière ligne car 'double operator() (double, double)' n'est pas défini dans 'binary_function', tout comme l'appel de toute méthode ajoutée dans une classe dérivée par une base échouerait ... –

+0

@David: D'accord, je l'ai compris maintenant. Merci. Postez-le comme réponse et je l'accepterai. –

Questions connexes