Warum hat den folgenden gibt keinen Übersetzungsfehler ?:Keine "Neudefinition des Standardparameterfehlers" für die Memberfunktion der Klassenvorlage?
// T.h
template<class T> class X
{
public:
void foo(int a = 42);
};
// Main.cpp
#include "T.h"
#include <iostream>
template<class T> void X<T>::foo(int a = 13)
{
std::cout << a << std::endl;
}
int main()
{
X<int> x;
x.foo(); // prints 42
}
Es scheint, als ob die nur vom Compiler automatisch ignoriert wird. Warum ist das?
Die Cooky-Sache ist, dass, wenn die Klassenvorlage Definition ist in Main.cpp anstelle einer Header-Datei, bekomme ich tatsächlich die Standardparameter Neudefinition Fehler.
Jetzt weiß ich, der Compiler wird sich darüber beschweren, wenn es nur eine gewöhnliche (nicht Vorlage) Funktion wäre.
Was sagt der Standard zu Standardparametern in Memberfunktionen oder Funktionsschablonen von Klassenschablonen?
g ++ * bricht die Kompilierung mit einem Fehler ab. – sth
Wenn Sie sagen "... wenn die Template-Deklaration in ... ist" nehme ich an, dass Sie die Definition der Klassenvorlage meinen, also 'template class x {....};'. Wenn ja, dann sagen Sie, dass das Ersetzen der Include-Direktive durch diese Template-Klassendefinition eine andere Compiler-Nachricht erzeugt? Das deutet darauf hin, dass es etwas anderes in der Header-Datei gibt, d. H., Versuchen Sie, den gesamten Inhalt der Header-Datei dorthin zu kopieren, wo die include-Anweisung war, und vermutlich erhalten Sie dann keine Compiler-Warnung? –
Troubadour
Es könnte irgendwie auf diesen VC++ - Fehler bezogen werden: https://connect.microsoft.com/VisualStudio/feedback/details/496593/msdn-forum-splitting-templated-function-with-default-argument-into-declaration-definition -gives-compilation-error –