使用STL算法的本地类

时间:2009-04-12 23:11:18

标签: c++ stl stl-algorithm

我一直想知道为什么你不能使用本地定义的类作为STL算法的谓词。

在问题:Approaching STL algorithms, lambda, local classes and other approaches中,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开始,使用本地类型作为模板参数是合法的。

2 个答案:

答案 0 :(得分:53)

C ++ 98/03标准明确禁止它。

C ++ 11删除了这个限制。

更完整:

  

对类型的限制   用作模板参数列出   在C ++ 03的第14.3.1条中(和   C ++ 98)标准:

     

本地类型,没有链接的类型,   未命名的类型或复合类型   任何这些类型都不得   用作a的模板参数   模板类型参数。

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表达式。

答案 1 :(得分:5)

限制将在'0x中删除,但我认为你不会非常使用它们。那是因为C ++ - 0x会有lambda! :)

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); })
}

我在上面的语法可能并不完美,但总体思路就在那里。