2011-09-17 19 views
6

Cuando descomentar la expresión condicional, el programa dejará de compilar bajo c visual ++ 2008.boost :: bind no puede funcionar con la expresión condicional?

#include <iostream> 
#include <boost/bind.hpp> 
#include <boost/thread.hpp> 
typedef boost::function<void(int, int)> vii_t; 
typedef boost::function<void(int)> vi_t; 

void foo(int a, int b){} 
void bar(int a){} 
int main(int argc, char* argv[]) 
{ 
    //vi_t test= true ? boost::bind(foo, _1, 100) : boost::bind(bar, _1); 
    vi_t test1 = boost::bind(foo, _1, 100); 
    vi_t test2 = boost::bind(bar, _1); 
    //test(1); 
    test1(1); 
    test2(1); 
    return 0; 
} 
+2

Como punto de etiqueta, podría evitar constructos específicos del compilador como '_tmain' y' _TCHAR'. Utilice 'int main (int argc, char * argv [])'. –

+1

¿Podría publicar el error del compilador? – thiton

+0

Por cierto, los encabezados estándar (como 'iostream') se incluyen con corchetes angulares, no con comillas (es decir:' #include ', no' "iostream" ' –

Respuesta

1

en la expresión c ? x : y x e y deben ser del mismo tipo, o uno debe ser convertible al otro. Ese tipo común es el tipo de la expresión completa.

Presumiblemente, boost::bind con diferentes números de parámetros devuelven diferentes tipos que no son convertibles entre sí. Que ambos puedan ser convertibles a vi_t no ayuda.

+2

Estoy de acuerdo - como una prueba, si echa las dos expresiones más a la derecha del operador ternario a vi_t, debería compilar. –

+0

Suena bien. Otra forma que debería funcionar es reemplazar el operador ternario con un if. – Staffan

+0

Esto es una consecuencia de una regla más grande en C/C++: el tipo que esperas obtener nunca determina cómo se calcula ese valor. Entonces en código como 'float f = 2/3;' o 'float f = foo (2);', el tipo de división utilizado o la sobrecarga de 'foo' elegida no se verán afectados de ninguna manera por el hecho de que usted almacena el resultado en un float. –

Cuestiones relacionadas