2011-11-03 86 views
2

我們的一個類提供了tr1 :: function回調對象。當我嘗試分配一個成員函數時,雖然,我得到一個編譯器錯誤。下面C++:給tr1 :: function對象分配函數

的實施例是未測試的而只是爲了說明:

foo.h中:

class Foo() 
{ 
public: 
    Foo(); 
    std::tr1::function<void (int x)> F; 
} 

Bar.h:

class Bar() 
{ 
public: 
    Bar(); 
    Foo* foo; 
    void HookUpToFoo(); 
    void Respond(int x); 
} 

Bar.cpp:

Bar() 
{ 
    this->foo = new Foo(); 
    this->HookUpToFoo(); 
} 

void Bar::HookUpToFoo() 
{ 
    this->foo->F = &Bar::Respond; // error 
} 

void Bar::Respond(int x) 
{ 
     // do stuff 
} 

我們得到的編譯器錯誤指的是在xrefwrap中是一行並且是 錯誤1錯誤C2296:'。*':非法,左操作數具有類型'int'C:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ xrefwrap 64

..我在分配代表時做錯了什麼?我想走更現代的路線,並使用tr1 :: function而不是函數指針。

回答

5

成員函數接受一個額外的隱藏參數:this。這使它與您只接受一個參數的對象function不兼容。您可以在tr1成員函數結合使用bind一個特定的實例,這也是可供選擇:

using namespace std::tr1::placeholders; 

this->foo->F = std::tr1::bind(&Bar::Respond, this, _1); 

這確保了Bar::Respond將與結合到this正確的值被調用。 _1是附加參數(x)的佔位符。

+4

或者只是'std :: tr1 :: bind(&Bar :: Respond,this)',沒有佔位符。 –

+0

@Alexandre:如果沒有佔位符,它不起作用:http://www.ideone.com/k3VD9 – interjay

+0

謝謝interjay,它在我使用綁定而不是使用=指定時有效。注意:我還必須使用佔位符,否則它不會編譯。 –

1

Bar::Respond是一個成員函數,而不是函數。沒有this就無法調用它。這與void (Bar::*)(int)成員函數指針和void (*)(int)函數指針之間的差異相同。

您可以使用mem_fn從成員函數創建一個function對象。

F = std::bind1st(std::tr1::mem_fn(&Bar::Respond), this); 
相關問題