Kann der template-Parameter eines Konstruktors angegeben werden?
Konstruktor der Klasse kann eine template-Funktion. An der Stelle, wo so ein Konstruktor aufgerufen wird, der compiler in der Regel schaut auf die gegebenen Argumente an den Konstruktor und bestimmt die verwendeten template-Parameter von Ihnen. Gibt es auch die syntax zum angeben der template-Parameter explizit?
Ein erfundenes Beispiel:
struct A {
template<typename T>
A() {}
};
Gibt es eine Möglichkeit diese Klasse instanziieren? Was ist die syntax explizit den Konstruktor der template-Parameter?
Mein Anwendungsfall wäre ein problem waren die compiler nicht scheinen zu finden, die richtigen Vorlagen-Konstruktor. Explizite Angabe der template-Parameter würde wahrscheinlich generieren, mehr nützliche Fehlermeldungen oder sogar das problem zu beheben.
- Die explizite Angabe von template-Argumente für Konstruktoren funktioniert nur in explizite Spezialisierungen, Instanzen, out-of-line-Definitionen und friend-Deklarationen des Konstruktors.
template <class TArg> struct A { template<typename T = TArg> A() {} };
- funktioniert gut für mich. Aber natürlich haben wir jetzt die Vorlage Klasse.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht. Die C++03-standard sagt:
Gibt es eine andere Lösung für die übertragung von Typ-Informationen zu Vorlagen-Konstruktoren, die können nicht einen Wert dieses Typs als argument:
Edit:
Bitte beachten Sie:
A a(id<int>());
wird nicht funktionieren, weil die meisten vexing parse. Würde es interpretiert werden als eine Funktion Erklärung. Sehen diese Frage für weitere Erklärung.Nein, Sie kann nicht instanziiert werden, die Klasse mit diesem Konstruktor. ABER:
Nun können Sie.
template <typename T> A(const T* = NULL);
achten Sie darauf, dass der Raum zwischen * und =, oder Sie werden sich Fragen, für Tage, was die Fehlermeldung bedeutet...Als Problemumgehung: Sie können definieren, eine vorgefertigte statische factory-Funktion, die in sich wiederum zurückkehren würde, eine Instanz mit einem privaten Konstruktor.
Bekommen Sie dann neue Instanzen Einer wie dieser: