2017-05-15 5 views
0

Ich habe eine Vorlage-Klasse namens MATRIX, die einen einzelnen Parameter T nimmt. Ich möchte eine Funktion schreiben, die eine MATRIX nimmt und eine T-Wert-Ausgabe zurückgibt. MATRIX type definiert T als elem_type in seiner Implementierung. Mein erster Versuch, dies zu tun war:Vorlage Template-Parameter, innere Parameter nicht fest

template<template<typename> class MATRIX> 
class MyClass 
{ 
... 
    MATRIX<>::elem_type myfun(const MATRIX<>& m1); 
} 

Dies führt zu einem Fehler „Argumentliste für Template-Template-Parameter‚MATRIX‘fehlt“, was Sinn macht es zu betrachten. Das Problem ist, dass ich keine Ahnung habe, was ich dort hinstellen soll. Ich könnte zum Beispiel float angeben, aber ich möchte, dass diese Funktion funktioniert, unabhängig davon, ob der Parameter von MATRIX float, double, uint_16 oder was auch immer ist. Ist es möglich, dies zu tun, ohne alle möglichen Parameter für MATRIX spezifisch aufzuzählen?

+1

Willkommen Überlauf zu stapeln. Bitte nehmen Sie sich die Zeit, [The Tour] (http://stackoverflow.com/tour) zu lesen und beziehen Sie sich auf das Material aus der [Hilfe] (http://stackoverflow.com/help/asking), was und wie Sie können fragen Sie hier. –

Antwort

1

Der einfachste Weg zur Lösung dieses Problems ist, indem Sie MyClass einen einzigen Template-Parameter nehmen und ihn dann explizit auf MATRIX spezialisieren.

template <typename> 
class MyClass; 

template <template <typename> class MATRIX, typename T> 
class MyClass<MATRIX<T>> 
{ 
    // ... 
    typename MATRIX<T>::elem_type myfun(const MATRIX<T>& m1); 
}; 

live example on wandbox

+0

Danke für die Klärung. Das Beispiel der Wandbox war besonders hilfreich. –

1

Wenn Sie eine Vorlage Template-Parameter haben, ist es notwendig, eine andere Vorlage Argument zu schaffen, die verwendet werden können, um die Vorlage Template-Parameter zu instanziiert.

template<template<typename> class MATRIX, typename ElemenType> 
class MyClass 
{ 
} 

Dann können Sie verwenden:

template<template<typename> class MATRIX, typename ElemenType> 
class MyClass 
{ 
    typename MATRIX<ElementType>::elem_type myfun(const MATRIX<>& m1); 
} 
Verwandte Themen