2010-06-29 83 views
0

我是使用STL算法的新手,目前我停留在語法錯誤上。我的總體目標是像在c#中使用Linq一樣過濾源列表。在C++中可能有其他方法來做到這一點,但我需要了解如何使用算法。std :: binary_function使用的語法

我的函數適配器使用我的用戶自定義函數對象是

struct is_Selected_Source : public std::binary_function<SOURCE_DATA *, SOURCE_TYPE, bool> 
{ 
bool operator()(SOURCE_DATA * test, SOURCE_TYPE ref)const 
    { 
    if (ref == SOURCE_All) 
     return true; 
    return test->Value == ref; 
    } 
}; 

而在我的主程序,我使用如下 -

typedef std::list<SOURCE_DATA *> LIST; 
LIST; *localList = new LIST;; 
LIST* msg = GLOBAL_DATA->MessageList; 
SOURCE_TYPE _filter_Msgs_Source = SOURCE_TYPE::SOURCE_All; 

std::remove_copy(msg->begin(), msg->end(), localList->begin(), 
    std::bind1st(is_Selected_Source<SOURCE_DATA*, SOURCE_TYPE>(), _filter_Msgs_Source)); 

什麼,我發現了在Rad Studio 2010中出現以下錯誤。此錯誤表示「您的源文件使用了typedef符號,其中變量應出現在表達式中」。

「的typedef E2108使用不當‘is_Selected_Source’」


編輯 - 做VS2010中,它具有更好的編譯器診斷的詳細的實驗後,我發現這個問題是remove_copy的定義只允許uniary功能。我將這個功能改爲非法行爲並讓它起作用。

回答

0

(這僅僅是相關的,如果你不小心遺漏了一些代碼,從問題的,並且可能不會解決您遇到的確切的問題),您使用is_Selected_Source爲模板,即使

你沒有把它定義爲一個。第二個代碼片段中的最後一行應該爲std::bind1st(is_Selected_Source() ...

或者您可能確實想將其用作模板,在這種情況下,您需要向模板聲明添加模板聲明。

template<typename SOURCE_DATA, typename SOURCE_TYPE> 
struct is_Selected_Source : public std::binary_function<SOURCE_DATA *, SOURCE_TYPE, bool> 
{ 
    // ... 
}; 
+0

您的第一個答案解決了我的大部分問題,但是現在當我編譯時,我得到了 - E2034無法將'const SOURCE_TYPE'轉換爲'SOURCE_DATA *' – 2010-06-29 20:01:37

+0

使用修改後的代碼和錯誤消息可能會更簡單。當使用單個線程解決一段時間內的幾個問題時,它可能會有點混亂:) – Cogwheel 2010-06-29 20:08:06

+0

乍一看,聽起來好像你正在用錯誤的參數實例化binary_function。也許你正在傳遞指針類型作爲參數,當你只是傳遞基類型? (is_Selected_Source模板處理將其轉換爲指針) – Cogwheel 2010-06-29 20:09:36

0

在猜測(儘管這只是一個猜測)的問題是,std::remove_copy需要一個,但你提供一個謂語。要使用謂詞,你想使用std::remove_copy_if(然後你會想聽@Cogwheel的答案)。

我還注意到:

LIST; *localList = new LIST;; 

看來錯了 - 我猜你想要的結果:

LIST *locallist = new LIST; 

代替。