Search code examples
c++stlstl-algorithm

Using local classes with STL algorithms


I have always wondered why you cannot use locally defined classes as predicates to STL algorithms.

In the question: Approaching STL algorithms, lambda, local classes and other approaches, BubbaT mentions says that 'Since the C++ standard forbids local types to be used as arguments'

Example code:

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
}

Does anyone know where in the standard is the restriction? What is the rationale for disallowing local types?


EDIT: Since C++11, it is legal to use a local type as a template argument.


Solution

  • It's explicitly forbidden by the C++98/03 standard.

    C++11 remove that restriction.

    To be more complete :

    The restrictions on types that are used as template parameters are listed in article 14.3.1 of the C++03 (and C++98) standard:

    A local type, a type with no linkage, an unnamed type or a type compounded from any of these types shall not be used as a template-argument for a template type-parameter.

    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 }
    

    Source and more details : http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=420

    To sum up, the restriction was a mistake that would have been fixed sooner if the standard was evolving faster...

    That said today most last versions of common compilers does allow it, along with providing lambda expressions.