Explicit Instantiation
-
Ich lese gerade zum zweiten Mal den Primer durch und bin bei function-templates angekommen. Ich Primer gibt es dann ein Beispiel für "Explicit Instantiation"
Ich habe mir folgendes Beispiel gecodet:
#include <iostream> using std::cout; using std::cin; using std::endl; struct job { char name[40]; double salary; int floor; }; template <typename T> void Swap( T &a, T &b ) { cout << "Use general template" << endl; T temp = a; a = b; b = temp; } template <> void Swap<job>( job &a, job &b ) { cout << "Use specialization for job" << endl; job temp = a; b = a; a = temp; } int main() { char ch1 = 'a'; char ch2 = 'b'; template void Swap<char>( char &, char & ); // The error occurs here }Ich bekomme die folgenden Fehlermeldungen:
1>c:\users\urs hp\documents\visual studio 2010\projects\testing\testing\main.cpp(45): error C2951: template declarations are only permitted at global, namespace, or class scope
1>c:\users\urs hp\documents\visual studio 2010\projects\testing\testing\main.cpp(45): error C2252: an explicit instantiation of a template can only occur at namespace scopeIch glaube ich weiss was der Compiler versucht mir zu sagen. Aber im Primer steht fast ein identisches Beispiel. Kann mir jemand sagen wiso das in der main() nicht klappt?
-
Zeile 35 ist eine Funktionsdeklaration innerhalb einer Funktion. Das ist nicht zulässig.
Wie die Fehlermeldung schon aussagt, darf man dies nur im globalen Gültigkeitsbereich oder im Scope der Klasse oder des Namensraumes.icarus2 schrieb:
Aber im Primer steht fast ein identisches Beispiel
Was bedeutet denn "fast"

-
int main() { char ch1 = 'a'; char ch2 = 'b'; Swap(ch1, ch2); }Suchst Du das?
-
@BasicMan01
Im Primer steht die Zeile
template void Swap<char>( char &, char & )
genau so in der main drin.Es soll eine explizitie Spezialisierung sein für die Templatefunktion. Im Prinzip ist mein Beispiel genau das gleiche wie im Primer. Ich habe nur eine Spezialisierung mehr.
@Theta
Nein, es soll eine explizite Spezialisierung definieren. Gemäss dem Primer müsste das möglich sein.Es steht im Primer in Kapitel 8. S. 381 falls das jemandem hilft.
*Edit
@ Theta
In deinem Beispiel wird ja implizit das Template für char definiert. Ich möchte das nun jedoch auch explizit machen können. Kann es sein, dass Visual Studio 2010 das nicht unterstützt?
-
Ich nehme dann mal an, dass es sich entweder um einen Fehler im Buch handelt oder, wenn niemandem dieses Konstrukt bekannt vorkommt, dass es völlig unwichtig ist

-
icarus2 schrieb:
Aber im Primer steht fast ein identisches Beispiel.
Betonung auf "fast identisch".
-
Fall jemand nachlesen möchte - das steht nicht im Primer von Lippman&Moo, sondern im C++ Primer Plus von Prata.
-
Ja, fast identisch. Nur sehe ich den wesentlichen Unterschied nicht ^^ Ich verstehe nicht was in meinem Beispiel nicht geht. Ich wers nochmal durchlesen und drüber nachdenken ^^
Jo sry, hätte sagen müssen, dass es der C++ Primer Plus von Prata ist

-
icarus2 schrieb:
Ja, fast identisch. Nur sehe ich den wesentlichen Unterschied nicht ^^ Ich verstehe nicht was in meinem Beispiel nicht geht.
Die Fehlermeldung sagt es dir ja bereits. Eine explizite Instanzierung gehört in den globalen, namespace oder class scope. Und nicht in den scope einer Funktion. Ist ja auch nichts laufzeitrelevantes. Warum sollte es dann in eine Funktion rein?
template void Swap<char>( char &, char & ); // ok int main() { char ch1 = 'a'; char ch2 = 'b'; }Und schon gehts.
Wenn das Buch etwas anderes sagt ist es sehr wahrscheinlich (ich hab jetzt nicht im Standard nachgeschaut) falsch.
-
Ja, ich nehme dann mal an, dass es ein Fehler im Buch ist. Ist onehin merkwürdig, ich wusste gar nicht was das überhaupt genau bewirken soll. Weil ich es nicht verstanden habe habe ich es dann mal ausprobiert.
Danke für eure Antworten.
-
icarus2 schrieb:
Ja, ich nehme dann mal an, dass es ein Fehler im Buch ist. Ist onehin merkwürdig, ich wusste gar nicht was das überhaupt genau bewirken soll.
Es soll Kompilierungszeiten und Code Generierung optimieren.
-
Achso, danke. Das steht hier im Buch nicht.