templates und das export keyword
-
bleeding_EDG schrieb:
Das Hauptproblem ist, dass die Instanzierung von den aktuellen Symbolen abhängt. Beispiel:
template <typename T> struct S { S() { T x; f(x); } }; struct MyStruct {}; // a.cpp namespace { void f(MyStruct) {} } void a() { S<MyStruct> s; } // Konstruktor ruft f(MyFunc) aus a.cpp auf // b.cpp namespace { void f(MyStruct) {} } void b() { S<MyStruct> s; } // Konstruktor ruft f(MyFunc) aus b.cpp aufexport kann also nicht das machen, was du vorschlägst. Worauf es raus läúft, ist, dass der Code erst vom Linker kompiliert werden kann. export ist broken.
Wobei in diesem Falle allerdings die ODR verletzt wird. Schlimmer: diese Verletzung führt nur zu UB.
-
Wobei in diesem Falle allerdings die ODR verletzt wird.
Warum "allerdings"? Gerade deswegen hat er doch das Beispiel gebracht.
Schlimmer: diese Verletzung führt nur zu UB.
Kann der Linker so etwas prinzipiell erkennen und Warnungen geben (auch wenn er false positives meldet)?
-
Arcoth schrieb:
Schlimmer: diese Verletzung führt nur zu UB.
Kann der Linker so etwas prinzipiell erkennen und Warnungen geben (auch wenn er false positives meldet)?
Nun, zumindest in diesem Fall sollte der Linker zwei verschiedene Definitionen der selben Funktion (
S<MyStruct>::S()) sehen...
-
dot schrieb:
Es gibt keine Templateklassen und auch keine Templatefunktionen.
Manchmal werden mit Templateklassen und auch Templatefunktionen Klassen und Funktionen bezeichnet die aus Templates generiert wurden. Das halte ich aber auch nicht für sehr hilfreich.
-
dot schrieb:
as du eigentlich willst, ist, dass die Definition des Template versteckt ist. Und das macht, wie bereits beschrieben, keinen Sinn.
Die Frage ist vor wem man diese verstecken möchte. Der Compiler braucht sie in den meisten Fällen. Der Programmierer, den nur die API interessieren soll, nicht.
-
Arcoth schrieb:
Wobei in diesem Falle allerdings die ODR verletzt wird.
Warum "allerdings"? Gerade deswegen hat er doch das Beispiel gebracht.
Dann habe ich das falsch verstanden. Es machte den Eindruck, als ob der Code so in Ordnung wäre, aber bei Verwendung von export nicht mehr funktionieren könnte.
Arcoth schrieb:
Schlimmer: diese Verletzung führt nur zu UB.
Kann der Linker so etwas prinzipiell erkennen und Warnungen geben (auch wenn er false positives meldet)?
Was tun, wenn sich die Verletzung auf Symbole bezieht, die der Linker gar nicht kennt (also z.B. das Beispiel abändern und statt unbenannter Nammensräume statische Funktionen nehmen)?