2011-09-17 15 views
6

Kiedy odkomentowaniu ekspresji warunkowej program nie kompilacji pod Visual C++ 2008.boost :: bind nie działa z wyrażeniem warunkowym?

#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

Jako punkt etykiety, proszę unikać konstruktów specyficznych dla kompilatora, takich jak '_tmain' i' _TCHAR'. Proszę użyć 'int main (int argc, char * argv [])'. –

+1

Czy mógłbyś opublikować błąd kompilatora? – thiton

+0

Nawiasem mówiąc, standardowe nagłówki (jako "iostream") są zawarte w nawiasach ostrych, a nie w cudzysłowach (np .: '#include ', nie '" iostream "') –

Odpowiedz

1

w ekspresji c ? x : y X oraz Y musi być tego samego typu lub muszą się być zdolne do przekształcenia w inne. Ten wspólny typ jest typem całego wyrażenia.

Prawdopodobnie boost::bind z różnymi parametrami zwraca różne typy, które nie są wzajemnie wymienialne. To, że oba mogą być zamienne do vi_t, nie pomaga.

+2

Zgadzam się - jako test, jeśli odrzuć dwa najdokładniejsze wyrażenia operatora trójskładnikowego do vi_t, powinno się skompilować. –

+0

Brzmi nieźle. Innym sposobem, który powinien zadziałać, jest zastąpienie operatora potrójnego znakiem if. – Staffan

+0

Jest to konsekwencja większej reguły w C/C++ - typ jakiego oczekujesz, nigdy nie określa sposobu obliczenia tej wartości. Tak więc w kodzie jak "float f = 2/3;" lub "float f = foo (2);", rodzaj zastosowanego podziału lub przeciążenie wybranego "foo" w żaden sposób nie wpłynie na to, że zapisujesz wynik w float. –

Powiązane problemy