2011-05-11 93 views

回答

5

你真正貼近實際!問題在於你直接使用Lambda的佔位符調用add(),它不會在lambda內懶散地評估,而是立即進行評估。

這裏有一個固定的版本:

using namespace boost::lambda; 
using boost::thread; 

int sum, x=2, y=6; 
thread adder(var(sum) = _1 + _2, x, y); 
adder.join(); 
cout << sum; 

如果你真的想使用add功能,你會使用bind

using namespace boost::lambda; 
using boost::thread; 

int add(int a, int b) {return a+b;} 

int sum, x=2, y=6; 
thread adder(var(sum) = bind(add, _1, _2), x, y); 
adder.join(); 
cout << sum; 
+1

並推遲一個函數調用,使用'的調用bind'。 – GManNickG 2011-05-11 23:43:50

+0

我絕對需要使用這個函數,'add'例子是一個粗略的簡化。 :)但我試過你的語法:'線程加法器(var(sum)= bind(add,_1,_2),x,y);' 我在MSVC 9(boost 1.43)上遇到錯誤。修正爲: 'boost/lambda/detail/function_adaptors.hpp(260):error C2664:'int(int,int)':無法將參數2從'rt2'轉換爲'int' 與 [ 結果= INT, Func鍵= INT(INT,INT), RET = INT, A2 = RT1, A3 = RT2, ARG1 = INT, Arg2所得= INT, A1 = RT1, I = 2 ]' – 2011-05-12 15:03:58

+0

沒關係。我忘了'使用boost :: lambda :: _ 1;'等。我想知道爲什麼我沒有得到更多的暴露錯誤。我甚至不確定我在範圍內有哪些_1/_2!我沒有任何使用boost或std的命名空間。 – 2011-05-12 15:13:10