templates: Rückgabetyp
-
Hallo,
Man kann in C++ ja Funktionen nicht überladen, wenn sie sich nur durch ihren Rückgabetyp unterscheiden. Folgendes geht also nicht:
int foo(); void foo();Jetzt hab ich aber etwas ähnliches mit einem template gelöst:
#include <string> #include <iostream> template<typename T> T foo(); template<> std::string foo() { return("foo"); } template<> int foo() { return(80); } int main() { std::cout << foo<std::string>() << foo<int>(); std::cin.get(); return(0); }Das ist ja letztlich vom Ergebnis nur insofern anders, als das man den Rückgabetyp als template-Parameter angeben muss.
Das schluckt VC++, er gibt "foo80" aus. Ist das Standardkonform, d.h. funktioniert das auf jedem Compiler?mfg
Mr X
-
Ja.
-
Ok, Danke
-
SeppJ schrieb:
Ja.
nur so aus interesse: warum??

-
Weil der Compiler daraus zwei verschiedene Funktionen mit unterschiedlichen Namen (mittels 'name mangling') macht, z.B. foo@std_string und foo@int.
Der Linker kriegt dann nur diese Namen zu sehen (und nicht den Template Namen).
-
Th69 schrieb:
Weil der Compiler daraus zwei verschiedene Funktionen mit unterschiedlichen Namen (mittels 'name mangling') macht, z.B. foo@std_string und foo@int.
Der Linker kriegt dann nur diese Namen zu sehen (und nicht den Template Namen).danke für die erklärung

-
Mr X schrieb:
Ist das Standardkonform
Ja.
d.h. funktioniert das auf jedem Compiler?
Ich bin mir nicht 100% sicher, aber ich denke mit VC6 wird es Probleme machen.
VC6 verwendet zum "auseinanderhalten" von Template-Funktionen nur die Parameter der Funktion, NICHT die Template-Parameter. Nachdem man in C++ nirgends nur mit dem Return-Typ überladen kann, schätze ich, dass hier auch der Return-Typ nicht geprüft wird.
Was bei VC6 passiert, ist, dass das Programm fehlerfrei compiliert und linkt, nur beim Ausführen kann es passieren, dass die falsche Funktion aufgerufen wird.
Mehr Infos hier (inklusive Workaround):
http://womble.decadent.org.uk/c++/template-faq.html#vc6-name-mangling-bug
Ab VC7 ist der Fehler behoben.