2017-05-05 5 views
3
template<typename T> 
struct A 
{ 
    template<typename U> 
    A() {} 

    template<typename U> 
    static void f() {} 
}; 

int main() 
{ 
    A<int>::f<int>(); // ok 
    auto a = A<int><double>(); // error C2062: type 'double' unexpected 
} 

Das Problem ist im Code selbst verständlich.Wie ruft man eine Vorlage ctor einer Vorlagenklasse auf?

Meine Frage ist:

Wie eine Vorlage Ctor einer Template-Klasse nennen?

+2

Die offensichtliche Bypass ist 'A :: A ();' aber dies ist illegal Syntax. Wie Vittorio in seiner Antwort erwähnt, ist dies ohne eine Art Wrapper unmöglich. –

Antwort

5

Sie können nicht direkt rufen Sie einen Konstruktor einer Klasse. Wenn Sie die Vorlagenargumente des Konstruktors nicht aus dem Aufruf ableiten können, kann dieser bestimmte Konstruktor nicht aufgerufen werden.

Was können Sie tun, ist eine Art von Art Wrapper erstellen, die für Null-Overhead-Abzug verwendet werden können:

template <typename T> 
struct type_wrapper { }; 

template<typename T> 
struct A 
{ 
    template<typename U> 
    A(type_wrapper<U>) {} 
}; 

int main() 
{ 
    auto a = A<int>(type_wrapper<double>{}); 
} 

live example on wandbox

3

Wie eine Vorlage Ctor einer Vorlage nennen Klasse?

Leider ist es unmöglich; Sie können Vorlagenargumente nicht explizit für Konstruktorvorlagen angeben.

§17.5.2/5 Member templates [temp.mem]

(Hervorhebung von mir)

[Anmerkung: Da die explizite Template-Argumentliste den Namen Funktionsvorlage folgt und weil Umwandlungselement Funktion Vorlagen und Konstruktor Elementfunktion Vorlagen genannt werden Ohne mit einem Funktionsnamen, gibt es keine Möglichkeit, eine explizite Vorlage Argumentliste für diese Funktionsvorlagen bereitzustellen. - Endnote]

Verwandte Themen