50

我一直想知道为什么不能使用本地定义的类作为 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 开始,使用本地类型作为模板参数是合法的。

4

2 回答 2

53

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

于 2009-04-12T23:15:14.007 回答
5

该限制将在 '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); })
}

我在上面的语法可能并不完美,但大致的想法是存在的。

于 2009-04-14T10:46:46.020 回答