2012-03-19 43 views
7

我想使用本地類作爲函子,並使用g ++(3.4.6)獲取編譯器錯誤。作爲函數的C++本地類

將下面的類(Processor)放在全局範圍內解決了錯誤,所以我猜錯誤是因爲函數局部結構/類。爲了代碼的清晰性和易用性,我希望在函數內部有類。想知道是否有一個解決方法來使下面的代碼工作。

TEST.CPP:24:錯誤:對呼叫\ u2018foreachArg沒有匹配的功能(INT &,炭 * &,processSubs(INT,字符* )::處理器&)\ u2019

template <class Functor> 
void foreachArg(int n, char *args[], Functor& f) 
{ 
    for(int i=0; i<n; ++i) 
     f(args[i]); 
} 

int processSubs(int argc, char *args[]) 
{ 
    class Processor 
    { 
     public: 
      void operator()(const char *arg) 
      { 
      } 
    }; 

    Processor p; 
    foreachArg(argc, args, p); 
} 

int main(int argc, char *argv[]) 
{ 
    processSubs(argc, argv); 
} 
+0

不,這兩個選項都使用C++ 11兼容的編譯器,或將該類移到該函數之外。 – 2012-03-19 15:10:38

+0

請參閱:http://stackoverflow.com/a/2598272/294864以獲取有關匿名結構作爲模板參數的C++ 11規範之前的參考。 – Akanksh 2012-03-19 15:51:27

+0

還有第三種選擇 - 使用「本地」仿函數成語。例如,Boost正在增加一個。 – 2012-08-09 16:32:25

回答

9

在C++ 11之前,用作模板函數參數的類必須具有外部鏈接。本地班級沒有外部鏈接,所以你不能以這種方式使用它們。

C++ 11對此進行了更改,因此您可以通過將編譯器設置爲使用C++ 11來解決此問題。

+0

不幸的是使用了一個編譯器(3.4.6 ---卡在石器時代: P)不支持C++ 0x,所以尋找智能解決方法 – Shanky 2012-03-19 15:05:58

+0

沒有真正的解決方法。據我所知,一些編譯器有一個擴展來允許這個pre-C++ 11,但不是gcc。如果你被困在當前的編譯器中,我認爲沒有比將函數移出本地範圍更好的選擇。 @Shanky – bames53 2012-03-19 15:10:31

+0

實際上有一些解決方法。不知道它是否適用於GCC 3.x,但在GCC 4.2和4.4中我使用了一個非常簡單的'LOCAL_FUNCTION'成語,它基於繼承和模板專門化,將實際的函數調用委託給外部基函數,到當地的。 Boost似乎最近推出了類似的東西(和Boost一樣,要好得多,但複雜度和依賴成本都很高)。 – 2012-08-09 03:00:27

0

您不能在C++ 03中使用本地類實例化模板。

此外,該標準已爲此提供了一項功能 - std::for_each

0

C++ 03不允許將本地定義的類作爲模板參數,正如您在此處發現的那樣。 C++ 11允許這樣做。使用gcc,你可以嘗試使用--std=c++0x

+0

不幸的是使用了一個不支持C++ 0x的編譯器(3.4.6 ---卡在石器時代:P),所以尋找智能解決方法 – Shanky 2012-03-19 15:04:30

0

如前所述,使用本地類不可能在C++ 11之前,而在C++ 11中無用,因爲lambdas不那麼羅嗦。

你應該簡單地在函數外聲明你的類。