2011-09-17 11 views
6

Quando Decommentare l'espressione condizionale, il programma non riuscirà a compilare sotto visual C++ 2008.boost :: bind non può funzionare con espressioni condizionali?

#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

Come punto di etichetta, si prega potreste evitare di costrutti specifici del compilatore come '' _tmain' e _TCHAR'. Si prega di usare 'int main (int argc, char * argv [])'. –

+1

Potresti per favore pubblicare l'errore del compilatore? – thiton

+0

Tra l'altro, le intestazioni standard (come 'iostream') sono inclusi con staffe angolari, non con le citazioni (vale a dire:' #include ',' non "iostream" ') –

risposta

1

nell'espressione c ? x : y x ed y devono essere dello stesso tipo o uno deve essere convertibile all'altro. Quel tipo comune è il tipo di tutta l'espressione.

Presumibilmente, boost::bind con diverso numero di parametri diversi tipi ritorno che non sono convertibili a vicenda. Che entrambi potrebbero essere convertibili in vi_t non aiuta.

+2

Sono d'accordo - come un test, se si lanciare le due espressioni più a destra dell'operatore ternario a vi_t, dovrebbe essere compilato. –

+0

Sembra giusto. Un altro modo che dovrebbe funzionare è quello di sostituire l'operatore ternario con un if. – Staffan

+0

Questa è una conseguenza di una regola più grande in C/C++ - il tipo che si aspettano di ottenere non determina come tale valore viene calcolato. Quindi in codice come 'float f = 2/3;' o 'float f = foo (2),' il tipo di divisione usato o il sovraccarico di 'foo' scelto non in alcun modo essere influenzata dal fatto che si memorizza il risultato in un galleggiante. –

Problemi correlati