2011-09-17 34 views
6

當我取消條件表達式,該程序將失敗在Visual C++ 2008boost :: bind不能使用條件表達式嗎?

#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

作爲禮儀的一點,請您避免編譯器特定的結構,如_tmain和_TCHAR。請使用'int main(int argc,char * argv [])''。 –

+1

您能否發佈編譯器錯誤? – thiton

+0

順便說一句,標準頭(作爲'iostream')包含在角括號中,而不是引號(即:'#include ',而不是''iostream「') –

回答

1

編譯在表達式c ? x : y x和y必須是相同的類型,或者一個必須能夠轉換到另一個。這種常見的類型是整個表達式的類型。

具有不同數量參數的boost::bind可能會返回不能互相轉換的不同類型。他們都可以轉換爲vi_t沒有幫助。

+2

我同意 - 作爲一個測試,如果你將三元運算符的兩個最右邊的表達式轉換爲vi_t,它應該進行編譯。 –

+0

聽起來沒錯。應該工作的另一種方法是用if替換三元運算符。 – Staffan

+0

這是C/C++中更大規則的結果 - 您期望得到的類型永遠不會確定如何計算該值。所以在像'float f = 2/3'這樣的代碼中或'float f = foo(2);',所使用的分割類型或所選'foo'的重載將不會受到將結果存儲在float中的事實的影響。 –