2010-11-08 81 views
0

我有一個模板類是這樣的:使用std ::函數來調用一個成員函數,而使用模板

template <typename T> 
class AguiEvent { 


std::vector<std::tr1::function<void(T, AguiWidget*)>> events; 
public: 
void call(AguiWidget* sender, T arg) const; 
void addHandler(std::tr1::function<void(T, AguiWidget*)> proc); 
void removeHandler(std::tr1::function<void(T, AguiWidget*)> proc); 
void removeHandler(); 
AguiEvent(); 
}; 

template <typename T> 
void AguiEvent<T>::removeHandler() 
{ 
    if(events.size() > 0) 
    { 
     events.pop_back(); 
    } 
} 


template <typename T> 
void AguiEvent<T>::addHandler(std::tr1::function<void(T, AguiWidget*)> proc) 
{ 
    events.push_back(proc); 
} 


template <typename T> 
void AguiEvent<T>::removeHandler(std::tr1::function<void(T, AguiWidget*)> proc) 
{ 
    for(int i = 0; i < events.size(); ++i) 
    { 
     if(events[i] == proc) 
     { 
      events.erase(events.begin() + i); 
      return; 
     } 
    } 
} 


template <typename T> 
void AguiEvent<T>::call(AguiWidget* sender, T arg) const 
{ 
    for(size_t i = 0; i < events.size(); ++i) 
     events[i](arg,sender); 
} 

template <typename T> 
AguiEvent<T>::AguiEvent() 
{ 
} 

然而,使用這樣的:

testWidget[count]->eventMouseClick.addHandler(&testWidget[0]->silly); 

導致此錯誤:

Error 5 error C2276: '&' : illegal operation on bound member function expression c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\main.cpp 190 

我以爲std :: function允許這個。我究竟做錯了什麼?

感謝

回答

3

假設testWidget[0]->silly與適當的簽名的成員函數,它看起來像你應該使用TR1的bind指定在其成員函數將被調用的對象:

function<void(T,AguiWidget*)> handler = bind(&TestWidget::silly, testWidget[0], _1, _2); 
testWidget[count]->eventMouseClick.addHandler(handler); 
+0

所以我沒有辦法在內部完成這個骯髒的工作,所以用戶所要做的就是去做&testWidget [0] - >愚蠢? – jmasterx 2010-11-08 17:06:41

+0

不,沒有語法將實例隱式地綁定到成員函數。 – 2010-11-08 17:22:38