Template template Parameter auf templates mit Parameterkonstanten?
-
//So in etwa ist mein code: template<class T,T t> class foo; template<class T,T c,template<class C,C c>f> class bar :public foo<T,t>{...};
error C3201: Die Vorlagenparameterliste für die Klassenvorlage 'foo' stimmt nicht mit der Vorlagenparameterliste für den Vorlagenparameter 'f' überein error C3855: 'bar': Vorlagenparameter 'T' ist mit der Deklaration nicht kompatibel error C3855: 'bar': Vorlagenparameter 'U' ist mit der Deklaration nicht kompatibel error C2977: 'bar': Zu viele Vorlagenargumente
Was mich verwirrt ist das U, hab garkeinss in meiner Definition? Was ist allgemein an meinem code falsch? Wie muss so ein template template Parameter aussehen?
-
error C3855: 'bar': Vorlagenparameter 'T' ist mit der Deklaration nicht kompatibel
error C3855: 'bar': Vorlagenparameter 'U' ist mit der Deklaration nicht kompatibelkann es sein,dass du mal ne vorwärtsdeklaration für bar mit den template parametern T und U geschrieben hast?
wenn ja, dann schieß ich mal ins blaue:
template<class T,class U> class bar;
dann darf U in deiner template spezialisierung auch keine template template parameter haben
//edit und nochn paar sachen, die ich aufgrund der späten uhrzeit vergessen hab:
template<class T,T c,template<class C,C c>f>
das muss natürlich so sein:
template<class T,T t,template<class C,C c>class f>
dann klappt das auch mit den templateparametern von foo
apropos foo: ich hoffe die klasse bar kennt mehr als nur die vorwärtsdeklaration von foo, sonst is es schlecht mit erben
-
Ja, da warn noch frienddeklarationen.
template<class T,T t,template<class C,C c>class f>
Dummer Fehler von mir, ist natürlich so. Aber das ist scheinbar noch nicht richtig. Ich bekomme immer Fehler, das die Vorlagenparameterliste nicht stimmt?
-
Das folgende compiliert hier:
template<typename T,T t> class foo {}; template < typename T, T c, template < typename C, C c > class f > class bar : public foo<T,c> { };
-
@ness dann hast du irgendwo eine vorwärtsdeklaration/template spezialisierung von bar, oder dein compiler macht das nicht mit.
-
OK, scheinbar bin ich grad zu blind das zu finden. Hier meine Vorwärtsdeklarationen:
template<class T,T t>class coding_node; template<class node>class simple_codingtree_iterator; template<class char_type>struct code_char; template < class Char_type, Char_type c, template<class>class Code_char, template<class T,T t>class node > class huffman; template < template<class Char_type,Char_type k,template<class>class,template<class C,C c>class>class coding=huffman, class cchar=mer::tchar, //ein typedef auf TCHAR, das ganze soll UNICODE-fest werden (Wenn s irgendwann klappt...[i] cchar ch=_T('*'), template<class T,T t>class node=coding_node, template<class>class Iterator=simple_codingtree_iterator > class coding_tree;
Fehlermeldungen:
error C3201: Die Vorlagenparameterliste für die Klassenvorlage 'huffman' stimmt nicht mit der Vorlagenparameterliste für den Vorlagenparameter 'coding' überein error C3201: Die Vorlagenparameterliste für die Klassenvorlage 'coding_node' stimmt nicht mit der Vorlagenparameterliste für den Vorlagenparameter 'node' überein error C3855: 'coding_tree': Vorlagenparameter 'ch' ist mit der Deklaration nicht kompatibel error C2955: 'coding_tree': für die Verwendung einer Vorlagenklasse ist eine Vorlagen-Argumentliste erforderlich Siehe Deklaration von 'coding_tree' ...
Zu den Fehlern: Ich habe _nicht_ noch mehr deklarationen. Doch, muss ich haben, sonst stände es nicht da...
-
template < template<class Char_type,Char_type k,template<class>class,template<class C,C c>class>class coding=huffman, class cchar=mer::tchar, //ein typedef auf TCHAR, das ganze soll UNICODE-fest werden (Wenn s irgendwann klappt...[i] cchar ch=_T('*'), template<class T,T t>class node=coding_node, template<class>class Iterator=simple_codingtree_iterator > class coding_tree;
OMG
da muss ich mich erstmal setzen.
ginge das nicht irgendwie einfacher?^^//edit was auch immer, das ding kompiliert bei mir aufjedenfall^^
(auch wenn ich den typ aus mer::tchar ein char und aus _T('') ein '' machen musste)
welchen compiler verwendest du? versuchs mal mit dem gcc falls dus noch nicht getan hast
-
Also ich hab den msvc. Das du aus mer::tchar char machen musst ist klar, das ist Teil meiner kleinen bescheidenen Bibliothek in der ich alle mein Funktionen und co. zusammenfasse. Ich denke ich versuche mal das ganze In einem neuen Projekt mit leeren Klassen zu kompilieren, mal sehen was passiert...
/edit: Wie haste das getestet? So:template<class T,T t>class coding_node { template<class T> friend class simple_codingtree_iterator; template < template<class Char_type,Char_type,template<class>class,template<class C,C c>class>class coding, class cchar, cchar ch, template<class T,T t>class node, template<class>class Iterator > friend class coding_tree; template<class T,T t,template<class>class U,template<class T,T t>class V> friend class huffmann; }; template<class node>class simple_codingtree_iterator { template < template<class Char_type,Char_type,template<class>class,template<class C,C c>class>class coding, class cchar, cchar ch, template<class T,T t>class node, template<class>class Iterator > friend class coding_tree; }; template<class char_type>struct code_char{}; template < class Char_type, Char_type c, template<class>class Code_char, template<class T,T t>class node > class huffman{}; template < template<class Char_type,Char_type k,template<class>class,template<class C,C c>class>class coding=huffman, class cchar=char, //ein typedef auf TCHAR, das ganze soll UNICODE-fest werden (Wenn s irgendwann klappt...[i] cchar ch='*', template<class T,T t>class node=coding_node, template<class>class Iterator=simple_codingtree_iterator > class coding_tree :public coding<cchar,ch,code_char,node> { friend node; };
? Da krieg ich:
error C3201: Die Vorlagenparameterliste für die Klassenvorlage 'huffman' stimmt nicht mit der Vorlagenparameterliste für den Vorlagenparameter 'coding' überein error C3201: Die Vorlagenparameterliste für die Klassenvorlage 'coding_node' stimmt nicht mit der Vorlagenparameterliste für den Vorlagenparameter 'node' überein error C3855: 'coding_tree': Vorlagenparameter 'ch' ist mit der Deklaration nicht kompatibel
/edit: friends ergänzt
/edit: Vererbung ergänzt...
-
*push*