2014-01-13 51 views
2

因此,在函數中定義一個謂詞並使用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參數爲實例,而不是一個類型。這是事實,這是一個模板功能,參數的類型仍然解決,但.. ..

有人可以解釋什麼和爲什麼會發生?

+9

確保您使用的是C++ 11。在C++ 98中,你不能使用本地類作爲模板參數。 –

回答

4

第一個問題的答案是,在C++ 11之前,某些類型(如本地類型)不允許作爲模板參數。見14.3.1/2:

本地型,無鍵的類型,未命名的類型或類型 從任何這些類型不應被用作模板類型參數 模板參數的混。

由於remove_if是一個模板,所以不能使用本地謂詞作爲其參數。

+0

我明白了。對我而言,這更像是一種限制,而不是一個缺失的功能,我不明白爲什麼它在舊標準中。對我來說沒有意義。這很有趣。 –