Usando classs locais com algoritmos STL

Sempre me perguntei por que você não pode usar classs definidas localmente como predicados para algoritmos STL.

Na questão: Aproximando-se de algoritmos STL, lambda, classs locais e outras abordagens , BubbaT menciona que ‘ desde que o padrão C ++ proíbe tipos locais para serem usados ​​como argumentos

Exemplo de código:

int main() { int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; std::vector v( array, array+10 ); struct even : public std::unary_function { bool operator()( int x ) { return !( x % 2 ); } }; std::remove_if( v.begin(), v.end(), even() ); // error } 

Alguém sabe onde no padrão é a restrição? Qual é a razão para não permitir tipos locais?


EDIT : Desde C + + 11, é legal usar um tipo local como um argumento de modelo.

É explicitamente proibido pelo padrão C / 98/03.

C ++ 11 remove essa restrição.

Para ser mais completo:

As restrições em tipos que são usados ​​como parâmetros de modelo estão listadas no artigo 14.3.1 do padrão C ++ 03 (e C ++ 98):

Um tipo local, um tipo sem binding, um tipo sem nome ou um tipo composto de qualquer um desses tipos não deve ser usado como um argumento-modelo para um parâmetro de tipo de modelo.

 template  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 } 

Fonte e mais detalhes: http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=420

Resumindo, a restrição foi um erro que teria sido corrigido mais cedo se o padrão estivesse evoluindo mais rápido …

Dito isso hoje, a maioria das últimas versões de compiladores comuns permite isso, junto com o fornecimento de expressões lambda.

A restrição será removida em ‘0x, mas não acho que você as use muito. E isso é porque o C ++ – 0x vai ter lambdas! 🙂

 int main() { int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; std::vector v( array, array+10 ); std::remove_if( v.begin() , v.end() , [] (int x) -> bool { return !(x%2); }) } 

Minha syntax acima pode não ser perfeita, mas a idéia geral está lá.