¿Por qué no puede una estructura definida dentro de una función puede utilizar como funtor std :: for_each?

StackOverflow https://stackoverflow.com/questions/4550914

Pregunta

El siguiente código no se compilará. El compilador se queja de * ninguna función coincidente para la llamada a for_each *. ¿Por qué es esto así?

#include <map>
#include <algorithm>

struct Element
{
    void flip() {}
};

void flip_all(std::map<Element*, Element*> input)
{
    struct FlipFunctor
    {
        void operator() (std::pair<Element* const, Element*>& item)
        {
            item.second->flip();
        }
    };

    std::for_each(input.begin(), input.end(), FlipFunctor());
}

Cuando muevo struct FlipFunctor antes flip_all función, los compila el código.

mensaje de error completo:

ninguna función coincidente para la llamada a 'for_each (std :: _ Rb_tree_iterator >, std :: _ Rb_tree_iterator >, flip_all (std :: mapa , std :: asignador >>) :: FlipFunctor) '

¿Fue útil?

Solución

std::for_each es una plantilla de función; uno de los parámetros de plantilla es el tipo de argumento de la función.

No se puede utilizar un tipo local como un argumento de plantilla. Es sólo una restricción para el idioma. En la próxima revisión de C ++, C ++ 0x, se elimina esta restricción, por lo que puede utilizar los tipos de locales como argumentos de plantilla.

Visual C ++ 2010 ya es compatible con el uso de las clases locales como argumentos de plantilla; apoyo en otros compiladores puede variar. Supongo que cualquier compilador que apoya C ++ 0x lambdas también apoyaría el uso de las clases locales como argumentos de plantilla (esto puede no ser del todo cierto, pero que tendría sentido).

Otros consejos

me sale un error diferente cuando intento compilar el código:

error: 'flip_all (__ gnu_debug_def :: mapa, std :: asignador>>) :: FlipFunctor' utiliza tipo local 'flip_all (__ gnu_debug_def :: mapa, std :: asignador>>) :: FlipFunctor'

que en realidad es de esperar, debido a un tipo local de la función (como su FlipFunctor aquí) tiene enlace interno, y un tipo de plantilla debe tener vinculación externa. Desde el tercer parámetro de std :: for_each es una plantilla, no puede pasar algo de un tipo local de la función a la misma.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top