因此,在函數中定義一個謂詞並使用std::list::remove_if
參數是不允許的?對std :: list :: remove_if(function():: predicate)調用沒有匹配函數
考慮下面的代碼,從而未能編譯:
struct a { };
int main()
{
struct pred { bool operator()(const a&) { return false; } };
std::list<a> l; // fill l
l.remove_if(pred());
return 0;
}
error: no matching function for call to
‘std::list<a, std::allocator<a> >::remove_if(main()::pred)’
現在,如果我有
pred()(*l.begin());
// or
pred p;
p(*l.begin());
這remove_if
內部確實取代了l.remove_if(pred());
,它編譯和作品如預期。
甚至更多:如果我將struct pred
被定義外爲主,兼顧測試正常工作。
此不作任何感我。
我認爲這可能是一些具有相關的名稱和ADL和這樣的事情,但是...的remove_if
參數爲實例,而不是一個類型。這是事實,這是一個模板功能,參數的類型仍然解決,但.. ..
有人可以解釋什麼和爲什麼會發生?
確保您使用的是C++ 11。在C++ 98中,你不能使用本地類作爲模板參數。 –