Classe locale C ++ en tant que foncteur

J’essaie d’utiliser une classe locale en tant que foncteur et obtenir une erreur de compilation en utilisant g ++ (3.4.6).

Placer la classe ci-dessous ( Processor ) dans la scope globale résout l’erreur. Je suppose donc que l’erreur est due aux structures / classes locales de la fonction. Je préférerais que les classes à l’intérieur de la fonction soient claires et faciles à utiliser. Vous voulez savoir s’il existe une solution de contournement pour que le code ci-dessous fonctionne.

test.cpp: 24: erreur: pas de fonction correspondante pour l’appel à \ u2018foreachArg (int &, char * &, processSubs (int, char * ) :: Processor &) \ u2019

 template  void foreachArg(int n, char *args[], Functor& f) { for(int i=0; i<n; ++i) f(args[i]); } int processSubs(int argc, char *args[]) { class Processor { public: void operator()(const char *arg) { } }; Processor p; foreachArg(argc, args, p); } int main(int argc, char *argv[]) { processSubs(argc, argv); } 

En C ++, avant C ++ 11, les classes utilisées comme arguments de fonctions de modèle doivent avoir une liaison externe. Les classes locales n’ont pas de lien externe, vous ne pouvez donc pas les utiliser de cette façon.

C ++ 11 change cela, vous pourrez donc peut-être résoudre ce problème en configurant votre compilateur pour qu’il utilise C ++ 11.

Vous ne pouvez pas instancier des modèles avec des classes locales en C ++ 03.

En outre, la norme fournit déjà une fonction pour this- std::for_each .

C ++ 03 n’autorise pas les classes définies localement à être des arguments de modèle, comme vous l’avez découvert ici. C ++ 11 permet cela. Avec gcc, vous pouvez essayer de comstackr avec --std=c++0x

Comme il a été dit, utiliser des classes locales pour cela n’était pas possible avant C ++ 11 et inutile sur C ++ 11 car les lambdas sont moins verbeuses.

Vous devriez simplement déclarer votre classe en dehors de la fonction.