簡體   English   中英

使用帶有 STL 算法的本地類

[英]Using local classes with STL algorithms

我一直想知道為什么不能使用本地定義的類作為 STL 算法的謂詞。

在問題中: 接近 STL 算法、lambda、本地類和其他方法,BubbaT 提到“由於 C++ 標准禁止將本地類型用作參數

示例代碼:

int main() {
   int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
   std::vector<int> v( array, array+10 );

   struct even : public std::unary_function<int,bool>
   {
      bool operator()( int x ) { return !( x % 2 ); }
   };
   std::remove_if( v.begin(), v.end(), even() ); // error
}

有誰知道標准中的限制在哪里? 禁止本地類型的理由是什么?


編輯:從 C++11 開始,使用本地類型作為模板參數是合法的。

C++98/03 標准明確禁止這樣做。

C++11 移除了這個限制。

更完整:

C++03 (和C++98)標准的第14.3.1條列出了用作模板參數的類型的限制:

局部類型、沒有鏈接的類型、未命名的類型或由這些類型中的任何一種復合的類型不應用作模板類型參數的模板參數。

template <class T> class Y { /* ... */  }; 
void func() {   
      struct S { /* ... */ }; //local class   
      Y< S > y1; // error: local type used as template-argument  
      Y< S* > y2; // error: pointer to local type used as template-argument }

來源和更多詳細信息: http : //www.informit.com/guides/content.aspx?g= cplusplus& seqNum=420

總而言之,這個限制是一個錯誤,如果標准發展得更快,它就會更早地修復……

也就是說,今天大多數最新版本的通用編譯器確實允許它,同時提供 lambda 表達式。

該限制將在 '0x 中刪除,但我認為您不會經常使用它們。 那是因為 C++-0x 將有 lambdas! :)

int main() {
   int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
   std::vector<int> v( array, array+10 );

   std::remove_if( v.begin()
                 , v.end()
                 , [] (int x) -> bool { return !(x%2); })
}

我上面的語法可能不完美,但大致思路就在那里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM