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.
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.