2010-07-28 67 views
2

爲什麼當我使用模板函數謂詞時這不起作用。Remove_if列表的謂詞

class A 
{ 
    int x; 
public: 
    A(int X):x(X){} 
    int getX() const {return x;} 
}; 

template <typename T> 
bool less_than_two(T const &a) 
{ 
    return (a.getX()<2); 
} 

int main() 
{ 
    list <A> l; 

    for (int i = 0; i < 5; i++) 
     l.push_back(i); 

    l.remove_if(less_than_two); 
} 
+1

'less_than_two'是一個函數模板,而不是一個函數。實例化它以獲得一個函數,就像納文說的那樣。 – GManNickG 2010-07-28 08:26:49

+1

請注意,當你使用一個函數對象'struct less_than_two {template bool operator()(const T&a){return a.getX()<2;}};這樣做會變得更容易。可能會對函數對象的成員函數進行內聯調用('operator()()'是成員函數),而不是通過函數指針調用。 – sbi 2010-07-28 08:43:35

回答

5

您需要實例化類型爲A的模板。所以你需要做l.remove_if(less_than_two<A>);