Frage zu Zeigern als Template-Parameter
-
Servus zusammen!
Warum darf ich, wenn ich z.B. eine Funktion mit dem folgenden Prototyp habe:template <size_t* x> void foo();nur die Adresse eines Objektes mit externem Linkage als Argument verwenden?
Außerdem: Mein Compiler (g++ afaik version 3.3x) meckert über folgenden Code:
template <size_t* x> void foo() { cout << "*x = <" << *x << ">\n"; } size_t* p = new size_t(9); int main() { foo<p>(); delete p; }Nicht jedoch über den folgenden:
template <size_t* x> void foo() { cout << "*x = <" << *x << ">\n"; } size_t p = 9; int main() { foo<&p>(); }Was macht es denn für einen Unterschied, ob ich den Wert eines Zeigers mit externe Linkage oder die Adresse eines Objektes mit externe Linkage als Template für foo() verwende? Compiler-bug?
Ich hoffe das ihr mir sagen könnt, was warum wie ist und wo ich meine Verständnisprobleme habe. :).
Und Btw: Ich hab irgendwie das Gefühl, dass das keine so tolle Lösung ist, nur um einem Template ein Argument zu übergeben, dass nicht (unbedingt) zur compile-Zeit feststeht. Gibt es schönere Alternativen? Wenn ja, welche?
Gruß Caipi
-
Warum darf ich, wenn ich z.B. eine Funktion mit dem folgenden Prototyp habe[...]nur die Adresse eines Objektes mit externem Linkage als Argument verwenden?
der compiler kennt nur die addresse von objekten mit external linkage. afair werden die addressen von allen anderen objekten erst vom linker festgelegt.
size_t* p = new size_t(9);dieser ausdruck ist nicht compilezeit konstant, und kann deshalb leider auch nicht verwendet werden(bei jedem programmstart kann p einen anderen wert haben. das ist natürlich schlecht für eine compilezeit konstante ;))
-
Caipi schrieb:
Ich hoffe das ihr mir sagen könnt, was warum wie ist und wo ich meine Verständnisprobleme habe. :).
Deine Funktion kann nicht zur Compile-Zeit instanziiert werden da p nicht konstant ist.
Caipi schrieb:
Und Btw: Ich hab irgendwie das Gefühl, dass das keine so tolle Lösung ist, nur um einem Template ein Argument zu übergeben, dass nicht (unbedingt) zur compile-Zeit feststeht. Gibt es schönere Alternativen? Wenn ja, welche?
Kann es sein dass du gar nicht erwähnt hast was du eigentlich machen willst.. oder hab ich's nur überlesen?
-
@otze und finix: Uuups... Jetzt wo ihr es sagt... Danke euch beiden! (Wie konnte mir das nur entgehen... *grml*...).
finix schrieb:
Caipi schrieb:
Und Btw: Ich hab irgendwie das Gefühl, dass das keine so tolle Lösung ist, nur um einem Template ein Argument zu übergeben, dass nicht (unbedingt) zur compile-Zeit feststeht. Gibt es schönere Alternativen? Wenn ja, welche?
Kann es sein dass du gar nicht erwähnt hast was du eigentlich machen willst.. oder hab ich's nur überlesen?
(*grml* again ;)). Jo. War wohl zu ungenau. Also, ich hab ein paar Template-Funktionen/Klassen, deren Verhalten - wer hätte das gedacht - von den übergebenen Template-Argumenten stark abhängt. Das (eventuelle) Problem hierbei ist, dass ich diese Template-Argumene erst zuf Laufzeit (durch den Benutzer) genau bestimmen kann...
Gruß Caipi
-
Caipi schrieb:
Das (eventuelle) Problem hierbei ist, dass ich diese Template-Argumene erst zuf Laufzeit (durch den Benutzer) genau bestimmen kann...
Dann sind templates wohl definitiv das Falsche. Wie wär's mit virtuellen Funktionen?
-
Jester schrieb:
Caipi schrieb:
Das (eventuelle) Problem hierbei ist, dass ich diese Template-Argumene erst zuf Laufzeit (durch den Benutzer) genau bestimmen kann...
Dann sind templates wohl definitiv das Falsche. Wie wär's mit virtuellen Funktionen?
Nope. Virtuelle Funktionen funktionieren hier nicht, da ich, wenn ich diese nutzen würde, noch zu meiner Rente an deren Redefinitionen sitzen würde ;).
Aber danke für deinen Post. Durch ihn habe ich nochmal genauer darüber nachgedacht, was ich eigentlich mache und es jetzt durch eine Änderung des Designs ohne Templates und ohne Polymorphie gelöst.Gruß Caipi
-
Caipi schrieb:
Also, ich hab ein paar Template-Funktionen/Klassen, deren Verhalten - wer hätte das gedacht - von den übergebenen Template-Argumenten stark abhängt. Das (eventuelle) Problem hierbei ist, dass ich diese Template-Argumene erst zuf Laufzeit (durch den Benutzer) genau bestimmen kann...
Also für mich klingt das danach als bräuchtest du eine ganz normale Funktion.
-
Ben04 schrieb:
Caipi schrieb:
Also, ich hab ein paar Template-Funktionen/Klassen, deren Verhalten - wer hätte das gedacht - von den übergebenen Template-Argumenten stark abhängt. Das (eventuelle) Problem hierbei ist, dass ich diese Template-Argumene erst zuf Laufzeit (durch den Benutzer) genau bestimmen kann...
Also für mich klingt das danach als bräuchtest du eine ganz normale Funktion.
Jup. So hab ich es letztendlich dann auch tlw. gemacht. Teilweise ;).
Gruß Caipi