2011-10-19 7 views
5

Tengo el siguiente escenario simplificado:error de sintaxis en la clase de plantilla con la expresión lambda

template< typename T> 
struct A 
{ 
    A() : action_([&](const T& t) { }) 
    {} 

private: 
    boost::function< void(const T&)> action_; 
}; 

Al compilar con Visual C++ 2010, me da un error de sintaxis en la construcción de action_:

1>test.cpp(16): error C2059: syntax error : ')' 
1>   test.cpp(23) : see reference to class template instantiation A<T>' being compiled 

Lo que es extraño es que el mismo ejemplo, sin parámetro de plantilla, compila muy bien:

struct A 
{ 
    A() : action_([&](const int& t) { }) 
    {} 

private: 
    boost::function< void(const int&)> action_; 
}; 

Sé que una solución al problema es mover la inicialización action_ en el cuerpo del constructor, en lugar de la lista de inicialización, como en el siguiente código:

template< typename T> 
struct A 
{ 
    A() 
    { 
    action_ = [&](const T& t) { }; 
    } 

private: 
    boost::function< void(const T&)> action_; 
}; 

... pero quiero evitar dicha solución.

¿Alguien encontró tal situación? ¿Hay alguna explicación/solución a este llamado error de sintaxis?

+0

FWIW, el ejemplo proporcionado (después de corregir las compilaciones '# include' faltadas) sin previo aviso con G ++ 4.6.1. –

+0

Es específico para Visual C++ 2010. –

Respuesta

1

¿Implementación rota de lambdas en Visual C++ 2010? Esa es mi mejor estimación para una explicación.

Aunque me intriga lo que hace la captura de variables de alcance por referencia en esta situación ... ¿Nada?

+0

Es un código simplificado para comprender el problema. En el caso real, necesito capturar el alcance para acceder a algunos miembros de datos (declarado, por lo tanto, inicializado antes del miembro action_). También sospecho que la mala implementación de lambdas ... –

+0

'[&]' capturará 'this', y de ese modo, todas las variables miembro (incluido él mismo). – spraff

Cuestiones relacionadas