2010-03-18 9 views
14

Ich gebe Foo nicht an die Außenwelt zurück. Es ist nur ein temporärer Typ, den ich innerhalb der Funktion verwende.Warum kann ein std :: vector keinen lokalen Typ annehmen?

+0

+1 Gute Frage! Habe noch nie davon gehört =) – SadSido

+0

@anon: Darf ich wissen, welchen Compiler Sie benutzt haben? – jasonline

+0

@anon: Ich könnte es zwar in Visual C++ 2005 kompilieren, aber ich denke, das entspricht nicht dem Standard, wenn es dort wirklich erwähnt wird. – jasonline

Antwort

14

Eine lokale Klasse kann kein Template-Argument sein. Da der Standard sagt: -

14.3.1 Absatz 2: „Ein lokaler Typ, ein Typ ohne Gestänge, eine unbenannte Art oder einen Typ von einem dieser Typen zusammengesetzt wird nicht als Template-Argument verwendet werden für einen Vorlagetyp-Parameter. "

[Example: 
template <class T> class X { /* ... */ }; 
void f() 
{ 
struct S { /* ... */ }; 
X<S> x3; // error: local type used as templateargument 
X<S*> x4; // error: pointer to local type used as templateargument 
} 
-end example] [Note: a template type argument may be an incomplete 
type (3.9). ]" 

Eine Abhilfe ist here auf c.l.c vorgeschlagen ++. Moderiert.

UPDATE: Es gab einige Diskussionen darüber, warum es nicht möglich ist, lokale Klassen als Vorlagenargumente zu haben? Die Links here und here auf c.std.C++ diskutieren das gleiche.

3

Kurze Antwort: Da die C++ Standard sagt so (Abschnitt 14.3.1)

Lange Antwort: Zu der Zeit, C++ standardisiert war, die C++ Normenausschuss angenommen, dass es die Umsetzung und Leistung wäre Probleme. Diese Befürchtungen erwiesen sich als unbegründet und haben die Entscheidung zum endgültigen Entwurf des C++ 0x-Standards aufgehoben.


Auf praktischer Kenntnis, unterstützen einige Compiler bereits die neuen C++ 0x Regeln:

  • Für MacOSX Sie gcc brauchen> = 4.5 mit dem -std=c++0x Befehlszeilenparameter
  • Für die Microsoft-Compiler müssen Sie> = vc8/VS2005 ohne die /Za Option (Spracherweiterungen deaktivieren)
Verwandte Themen