Warum sind Funktionsvorlagenspezialisierungen in einer Klasse nicht zulässig?

9

Nachdem ich auf viele meiner Fragen zu stackoverflow Antworten gefunden habe, bin ich nun auf eine Frage gestoßen, auf die ich die Antwort nicht finden kann und ich hoffe, dass jemand bereit ist, mir zu helfen!

Mein Problem ist, dass ich eine explizite Templatisierung einer Funktion in einer Klasse in C ++ machen möchte. Mein Compiler (g ++) und ein Blick in den C ++ - Standard (§14.7.3) sagen mir, dass diese Spezialisierung in dem Namensraum erfolgen muss, in dem die Klasse deklariert ist. Ich verstehe, dass dies bedeutet, dass ich die Spezialisierung nicht innerhalb der Klasse platzieren kann, aber ich sehe den Sinn dieser Einschränkung nicht! Weiß jemand, ob es einen guten Grund dafür gibt, die Spezialisierungen nicht innerhalb der Klasse machen zu lassen?

Ich weiß, dass es Problemumgehungen gibt, z.B. um die Funktion in eine Struktur einzufügen, aber ich möchte verstehen, warum die Sprache dieses Design hat. Wenn es einen guten Grund dafür gibt, spezialisierte Funktionen innerhalb der Klasse nicht zuzulassen, sollte ich es vermutlich wissen, bevor ich versuche, es zu umgehen.

Vielen Dank im Voraus!

Um meine Frage ein wenig präziser zu machen: Hier ist ein Code aus einem Testbeispiel, der veranschaulicht, was ich tun möchte:

%Vor%

Dies ist nicht möglich; g ++ sagt:

%Vor%

Wenn ich die Funktion execute außerhalb der Klasse in den Namensraum MalinTester lege, sieht das so aus:

%Vor%

und ich kann private Variable nicht in den templateten Versionen von execute verwenden, da es privat in der Klasse ist. Ich möchte es privat, da ich meine Daten so weit wie möglich gekapselt haben möchte.

Natürlich kann ich privateVariable als Argument für die Funktion senden, aber ich denke, es wäre schöner, dies zu vermeiden, und was ich wirklich frage ist, ob es einen guten Grund für den C ++ - Standard gibt, keine explizite Spezialisierung zu erlauben im ersten Codebeispiel oben.

@Arne Mertz: Dies ist die Problemumgehung, die ich versucht habe, aber es erlaubt auch nicht die Verwendung von privateVariable. Und vor allem frage ich mich, ob es eine gute Idee ist, so zu handeln. Da es mir nicht erlaubt ist, Spezialisierungen von Member-Funktionen vorzunehmen, sollte ich vielleicht auch keine Spezialisierungen von Funktionen machen, die in Strukturen innerhalb der Klasse eingekapselt sind.

%Vor%     
Malin 02.09.2013, 09:29
quelle

1 Antwort

3

Basisspezialisierung:

In .h:

%Vor%

In .cpp unter demselben Namespace:

%Vor%

Wenn Sie eine spezialisierte Funktion in einer spezialisierten Klasse wünschen:

Innerhalb der Klasse add (.h) (private Funktion):

%Vor%

Spezialisierung innerhalb von .cpp:

%Vor%

UPDATE:

Aber du kannst so etwas nicht schreiben:

%Vor%

Sie erhalten: error: einschließende Klassenvorlagen sind nicht explizit spezialisiert.

Es spielt keine Rolle, ob diese Definition innerhalb der Klasse oder im Namespace liegt. Der Punkt ist, dass dies keine exakte Teilspezialisierung ist - diese Funktion hat keine definierte Kontextklasse (welche Mitglieder möchten Sie aufrufen). Mit anderen Worten: Wenn Sie sich auf ein Mitglied spezialisieren, versuchen Sie tatsächlich, die ganze enthaltende Klasse zu spezialisieren, aber nicht das Mitglied selbst. Und der Compiler kann das nicht tun, weil die Klasse noch nicht vollständig definiert ist. Dies ist also eine Einschränkung durch das Template-Design. Und wenn es tatsächlich funktionierte - Vorlagen wären voll mit einfachen Makros. (Und Sie können wahrscheinlich Ihre Aufgabe mit etwas Makrozauber lösen.)

    
Victor Laskin 03.09.2013 10:32
quelle