2012-03-19 20 views
7

Estoy tratando de usar una clase local como un funtor y obtener el error del compilador usando g ++ (3.4.6).C++ clase local como functor

Al colocar la siguiente clase (Processor) en el alcance global se resuelve el error, por lo que supongo que el error se debe a la función de las estructuras/clases locales. Preferiría tener las clases dentro de la función para la claridad del código y la facilidad de uso. Desea saber si hay una solución alternativa para que el siguiente código funcione.

test.cpp: 24: error: no existe función de emparejamiento para la llamada a \ u2018foreachArg (int &, char * &, processSubs (int, char * ) :: Procesador &) \ u2019

template <class Functor> 
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); 
} 
+0

No, las dos opciones utilizan un compilador compatible con C++ 11 o mueven la clase fuera de la función. –

+0

Consulte: http://stackoverflow.com/a/2598272/294864 para obtener una referencia a la especificación anterior a C++ 11 con respecto a estructuras anónimas como argumentos de plantilla. – Akanksh

+0

Hay una tercera opción: utilizar un modificador de idioma "local". Boost está agregando uno, por ejemplo. –

Respuesta

9

En C++, antes de C++ 11, las clases utilizadas como argumentos para las funciones de plantilla deben tener un enlace externo. Las clases locales no tienen enlaces externos, por lo que no puede usarlas de esta manera.

C++ 11 cambia esto, por lo que puede solucionarlo configurando su compilador para usar C++ 11.

+0

desafortunadamente usando un compilador (3.4.6 --- atrapado en la edad de piedra: P) que no es compatible con C++ 0x por lo que busca una solución inteligente – Shanky

+0

No hay realmente una solución. Algunos compiladores tienen una extensión para permitir este pre-C++ 11, pero no gcc hasta donde yo sé. Si está atascado con su compilador actual, no creo que haya una mejor opción que mover el functor fuera del alcance local. @Shanky – bames53

+0

En realidad, hay algunas soluciones. No estoy seguro de si funciona en GCC 3.x, pero en GCC 4.2 y 4.4 estoy usando un lenguaje 'LOCAL_FUNCTION' muy simple, basado en herencia y especialización de plantilla, que delega la llamada de función real a funtores externos de base que virtualmente reenvían a los locales. Boost parece haber lanzado recientemente algo así (y como es habitual con Boost, mucho mejor, pero a una enorme complejidad y costo de dependencia). –

0

No se pueden crear instancias de plantillas con clases locales en C++ 03.

Además, el estándar ya proporciona una función para esto: std::for_each.

0

C++ 03 no permite que las clases definidas localmente sean argumentos de plantilla, como ha descubierto aquí. C++ 11 permite esto. Con gcc, puede intentar compilar con --std=c++0x

+0

desafortunadamente usando un compilador (3.4.6 --- atrapado en la edad de piedra: P) que no admite C++ 0x por lo que busca una solución inteligente – Shanky

0

Como se ha dicho, el uso de clases locales para esto no fue posible antes de C++ 11, y sobre inútil en C++ 11 porque las lambdas son menos prolijas.

Simplemente debe declarar su clase fuera de la función.

Cuestiones relacionadas