2013-05-17 7 views
10

Wenn ich eine Template-Klasse haben:Kann ich in einer C++ - Vorlagenklasse den Vorlagenparameter mit dem gleichen Namen eingeben?

template<typename Layout> 
class LayoutHandler : Handler { 
}; 

und ich möchte den Parameter-Layout für den Benutzer der Klasse belichten. Dann:

template<typename Layout> 
class LayoutHandler : Handler { 
public: 
    typedef Layout Layout; // using the same name 
}; 

VS2012 können diesen Code, kompilieren und das erwartete Ergebnis. (Ich verwende std :: is_same, um es zu überprüfen.) Ist dies in C++ 03 oder C++ 11 erlaubt?

+3

Ich würde vermuten, es erlaubt ist, aber würde entmutigen, dass, obwohl (nur nicht gut fühlen). Ich würde es bevorzugen, wie 'typedef Layout LayoutType;' nur zur besseren Lesbarkeit. –

+0

Persönlich bevorzuge ich nur einen Namen für eine Sache. In Konstruktoren schreibe ich auch etwas wie T :: T (int a): a (a) {} – jingyu9575

+0

Was ist der Zweck von 'typedef' es mit dem gleichen Namen? Ich verstehe es nicht ganz. –

Antwort

4

Es ist 11 nicht erlaubt in C++.

Eine typedef ist eine Deklaration. (siehe Abschnitt 7.1.3)

Ein template Parameter kann nicht innerhalb seines Bereichs (einschließlich verschachtelter Bereiche) neu deklariert werden. (Siehe Abschnitt 14.6.1.6)

C++11 draft standard n3242

1

Nein bis C + 11 Sie können es nicht verwenden, es gibt Ihnen einen Fehler.

Erklärung ‚typedef-Layout LayoutHandler :: Layout‘ Fehler: Schatten-Vorlage Parm ‚Klasse Layout‘

+1

Also ermöglicht Standard C++ 11 dies? – jingyu9575

+0

"Bis C++ 11 kann man es nicht benutzen" Ich glaube nicht, dass es auch für C++ 11 funktioniert (zumindest für mich). – edmz

Verwandte Themen