2014-10-24 7 views
5

Ich habe einen Wunsch, eine Klasse zu haben, die wie folgt aussieht:Kann eine Klasse einen Vorlagenkonstruktor ohne Argumente haben?

template <typename T> 
class foo 
{ 
    public: 
    template <typename S> 
    foo() 
    { 
     //... 
    } 
}; 

aber ich kann nicht herausfinden, wie der Konstruktor aufzurufen. Natürlich kann ich das machen, indem ich foo() ein Argument vom Typ S gebe, aber kann es ohne Argumente gemacht werden?

--Ron

+1

http://stackoverflow.com/questions/26553803/derivo-from-template-constuctor-of-template-base-class – 0x499602D2

Antwort

3

Sie können keine Vorlage Argumente explizit auf eine Konstruktor-Vorlage übergeben. Konstruktoren haben keine Namen.

[Hinweis: Da die explizite Template-Argumentliste folgt den Funktion Template-Namen, und da Umwandlungselement Funktion Vorlagen und Konstruktor Elementfunktion Vorlagen aufgerufen werden, ohne einen Funktionsnamen verwenden, gibt es keine Möglichkeit, Stellen Sie eine explizite Vorlage Argumentliste für diese Funktionsvorlagen. - Endnote]

Obwohl Sie foo<int>::foo einen Konstruktor mit der Syntax nennen kann, kann es nur in einer Weise verwendet werden, die hier nicht von Interesse sind:

In einer Lookup, in dem der Konstruktor ist ein akzeptables Ergebnis Lookup und die verschachtelter-name-specifier kürt eine Klasse C:
- wenn der Name nach den verschachtelten-name-Bezeichner angegeben, wenn in C nachgeschlagen, ist die injizierte -class-name von C (Ziffer 9) oder
- [...]
der Name statt betrachtet C den Konstruktor der Klasse zu nennen. [...] Ein solcher Konstruktor Namen dürfen nur in dem declarator-id einer Erklärung, deren Namen ein Konstruktor oder in einer mit Deklaration verwendet werden.

+0

"Sie können nicht fünf Vorlagenargumente zu einer Konstruktorvorlage": False. Siehe Konstruktor des Vektors, der mit einem Iteratorpaar initialisiert werden kann. Siehe (4) unter http://en.cppreference.com/w/cpp/container/vector/vector – Notinlist

+2

Sie können Vorlagenargumente ** nicht explizit ** an eine Konstruktorvorlage übergeben. Konstruktoren können Vorlagen sein, aber alle Vorlagenargumente müssen abgeleitet werden. –

+0

@BenVoigt Siehe meine Antwort. – Notinlist

1

Das ist für mich auf gcc 4.4.5 (Debian 4.4.5-3)

template<typename T> 
class A 
{ 
public: 
    template<typename U> 
    A() 
     : t(U()) 
    { } 
private: 
    T t; 
}; 

int main() 
{ 
    using namespace std; 
    A<float> a(A<float>::A<int>()); 
    return 0; 
} 

Zusammengestellt mit g++ -W -Wall -Wextra -pedantic tc.cpp -o tc, keine Warnungen funktioniert.

UPDATE: Diese Lösung ist falsch. Es wird in den Kommentaren erklärt. Ich halte es für eine nützliche schlechte Lösung und möchte es hier behalten. Bitte nicht runter, denn dann muss ich es entfernen. Ich hoffe, das wird funktionieren. Prost!

+1

Eigentlich was du machst [sollte nicht einmal kompilieren] (http://ideone.com/AJ90Rz) ... klingt wie ein Buggy g ++. – cdhowie

+2

Lol. 'A :: A ' entspricht "A ". Überprüfen Sie es mit 'std :: is_same'. ;) – Columbo

+0

Eine explizite Argumentliste folgt dem Namen der Vorlage, aber ** "Konstruktoren haben keine Namen." **. –

Verwandte Themen