Lokale classn mit STL-Algorithmen verwenden

Ich habe mich immer gewundert, warum Sie lokal definierte classn nicht als Prädikate für STL-Algorithmen verwenden können.

In der Frage: Approaching STL-Algorithmen, Lambda, lokale classn und andere Ansätze , sagt BubbaT erwähnt, dass ” Da der C ++ – Standard verbietet lokale Typen als Argumente verwendet werden

Beispielcode:

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 } 

Weiß jemand wo im Standard die Einschränkung ist? Was ist der Grund dafür, lokale Typen zu verbieten?


EDIT : Seit C ++ 11 ist es zulässig, einen lokalen Typ als Vorlage Argument zu verwenden.

   

    Es ist explizit durch den C ++ 98/03-Standard verboten.

    C ++ 11 entfernt diese Einschränkung.

    Um vollständiger zu sein:

    Die Einschränkungen für Typen, die als Vorlagenparameter verwendet werden, sind in Artikel 14.3.1 des Standards C ++ 03 (und C ++ 98) aufgeführt:

    Ein lokaler Typ, ein Typ ohne Verknüpfung, ein unbenannter Typ oder ein Typ, der aus einem dieser Typen zusammengesetzt ist, dürfen nicht als Template-Argument für einen Template-Typparameter verwendet werden.

     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 } 

    Quelle und weitere Details: http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=420

    Zusammenfassend lässt sich sagen, dass die Beschränkung ein Fehler war, der schneller behoben worden wäre, wenn sich der Standard schneller entwickelt hätte …

    Das heißt, heute erlauben die meisten letzten Versionen von gängigen Compilern das, zusammen mit Lambda-Ausdrücken.

    Die Einschränkung wird in ‘0x entfernt, aber ich glaube nicht, dass Sie sie sehr verwenden werden. Und das ist, weil C ++ – 0x Lambdas haben wird! 🙂

     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); }) } 

    Meine Syntax in den oben genannten kann nicht perfekt sein, aber die allgemeine Idee ist da.