Template Template Syntax Problem
-
Hallo
Wieso klappt dies nicht:
#include<vector> using namespace std; template<template<class>A> A<int>foo(A<int>a){return a;} void foo(A*){} int main(){ foo(vector<int>()); }
-
Ups
void foo(A*){}
Hat da eigentlich nichts zu suchen, hab vergessen es aus meinem Test Code heraus zuschneiden.
-
Du hast ein class vergessen:
template<template<class> class A>
Mein Compiler sagt dazu: Fehler: expected `class' vor "A"
So könnte man ganz einfach den Fehler beseitigen
-
Hallo
Versuch mal
template< template<class, class> class A, class T > //T für Allocator void foo(A<int,T> a) {} foo( vector<int>() );
Oder direkt
template< template<class, class> class A, class T1, class T2 > void foo(A<T1,T2> a) {} foo( vector<double>() ); foo( vector<char>() );
Aber Template-Template-Parameter auf diese Art zu Nutzen macht keinen Sinn. Zumindest seh ich ihn nicht. Genauso gut klappt nämlich
template< class T> void foo( T a ) {} foo( vector<int>() );
Denn was du an foo in deinem Besispiel übergibst ist ja bereits ein konkreter Typ.
-
Meiner sagt dazu :
Template template arguments must name a class
und ein andere den ich ausprobiert habe:
parse error before `>' token
Beide Meldungen helfen nicht wirklich.
Danke aber.
PS:Welcher compiler hat den eigentlich eine so genaue Fehlermeldung ausgespuckt?
-
schrieb:
PS:Welcher compiler hat den eigentlich eine so genaue Fehlermeldung ausgespuckt?
g++ (GCC) 3.4.1
-
GCC 3.3.2 sagt da aber nur:
parse error before `>' token
I sollte mal updaten.
-
Hallo,
es gibt keine *portable* Möglichkeit einen std::vector (oder einen beliebigen anderen Standard-Container) direkt an einen Template-Template-Parameter zu binden. Die Argumente für einen Template-Template Parameter müssen exakt passen. Es werden insbesondere keine Default-Werte berücksichtigt.
Der Standard schreibt nun aber nur vor, welche Parameter die Container haben müssen (und in welcher Reihenfolge), nicht aber wieviele zusätzliche Defaultparameter sie noch haben dürfen.
Demzufolge könnte eine Implementation std::vector auch 7 Template-Parameter verpassen. Solange die 5 zusätzlichen nach dem Allocator kommen und Default-Werte haben, kein Problem. Nur passt ein solcher std::vector dann auch nur auf einen Template-Template-Parameter mit 7 Parametern.Wirklich portabel ist man nur mit einem kleinen Wrapper. Oder man vertraut einfach darauf, dass alle verwendeten Libs die selbe Anzahl von Template-Parametern bei den Containern verwendet.