代码之家  ›  专栏  ›  技术社区  ›  David Rodríguez - dribeas

使用本地类和STL算法

  •  50
  • David Rodríguez - dribeas  · 技术社区  · 16 年前

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

    在问题中: Approaching STL algorithms, lambda, local classes and other approaches 布巴特提到说 因为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 回复  |  直到 10 年前
        1
  •  53
  •   Klaim    10 年前

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

    C++ 11删除该限制。

    要更完整:

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

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

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

        2
  •  5
  •   Richard Corden    16 年前

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

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