 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
LaFleche Guest
|
Posted: Fri Apr 09, 2004 10:40 pm Post subject: template imbriqué récalcitrant |
|
|
Bonjour,
Je n'arrive pas à faire une classe avec des templates "imbriqués",
c'est-à-dire de ce genre class A<T1 ,T2.
Les classes se compilent bien mais arrivé au main je me fait insulté par
le compilo lorsque je crée une instance.
Je suppose qu'il doit y avoir une syntaxe particulière mais je ne la
trouve .
Google ne m'a pas beaucoup aidé.
Voici la classe en question et l'instanciation.
## .H ##
template<typename S,template
class A
{
private : A<S> attribut;
};
## MAIN ##
....
int main()
{
A<int, Truc obj;
}
## ERREUR COMPIL (g++ 3.3.1 Linux) ##
Main.cc:9: error: type/value mismatch at argument 2 in template
parameter list for `template<class S, template class
Liste'
Main.cc:9: error: expected a class template, got `Truc<int>'
Alors que la classe Truc est parametré et les instances de Truc<>
fonctionnent sans problèmes.
Y'a-t-il un gouru dans la salle?
|
|
| Back to top |
|
 |
Matthieu Moy Guest
|
Posted: Fri Apr 09, 2004 10:44 pm Post subject: Re: template imbriqué récalcitrant |
|
|
LaFleche <altrash (AT) altern (DOT) org> writes:
| Quote: | ## .H ##
template<typename S,template
class A
{
private : A<S> attribut;
};
|
Non. A est juste un template à deux arguments. Pas d'imbrication ici.
| Quote: | int main()
{
A<int, Truc obj;
}
|
Là, c'est bon.
Si tu définie des fonctions, tu peux faire
int f(int, int);
int g(int);
et appeler
f(3, g(4))
Sans le mentionner dans la déclaration.
--
Matthieu
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Sat Apr 10, 2004 8:36 am Post subject: Re: template imbriqué récalcitrant |
|
|
LaFleche wrote:
| Quote: | Bonjour,
Je n'arrive pas à faire une classe avec des templates "imbriqués",
c'est-à-dire de ce genre class A<T1 ,T2.
|
Les template template existent, mais ce n'est pas exactement ce que tu
as écrit.
Par exemple :
template <class T, int i> class MathVector
{
//...
};
template <class T, int i> class blas_vector
{
//...
};
// Simple template
template <class T, int i> Dessin1
{
MathVector<T, i> data;
}
// Simple template aussi
template <class T> Dessin2
{
T data;
};
// Template template
templete <class T, int i, template
class Dessin3
{
Vec<T, i> data;
Vec<T, 2> projectionOnPlane
}
int main()
{
Dessin1<double, 3> d1; // le type de vecteur est fixé
Dessin2<blass_vector d2;
// le type est un seul bloc que le template ne peut pas séparer
Dessin3<double, 3, MathVector> d3;
// MathVector est donné sans arguments
// Dessin3 peut instancier MathVector avec les arguments de son choix
}
--
Loïc
|
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Sat Apr 10, 2004 11:52 am Post subject: Re: template imbriqué récalcitrant |
|
|
LaFleche <altrash (AT) altern (DOT) org> writes:
| Quote: | Bonjour,
Je n'arrive pas à faire une classe avec des templates "imbriqués",
c'est-à-dire de ce genre class A<T1 ,T2.
Les classes se compilent bien mais arrivé au main je me fait insulté
par le compilo lorsque je crée une instance.
Je suppose qu'il doit y avoir une syntaxe particulière mais je ne la
trouve .
Google ne m'a pas beaucoup aidé.
Voici la classe en question et l'instanciation.
## .H ##
template<typename S,template
class A
{
private : A<S> attribut;
};
## MAIN ##
...
int main()
{
A<int, Truc obj;
|
A<int, Truc> obj;
-- Gaby
|
|
| Back to top |
|
 |
LaFleche Guest
|
Posted: Fri Apr 16, 2004 12:36 am Post subject: Re: template imbriqué récalcitrant |
|
|
Loïc Joly wrote:
| Quote: | // Template template
templete <class T, int i, template
class Dessin3
{
Vec<T, i> data;
Vec<T, 2> projectionOnPlane
}
Merci Loïc pour ta réponse, |
Donc oui c'est bien ce que j'aimerai faire.
voici mon code (avec les corrections) : la déclaration des attributs ne
plaît pas du tout à g++ (sans les déclarations il compile).
--------
#include <vector>
template<class S, template
class G
{
private:
vector< A < S > > *a;
vector<S> *s;
....
};
--------
Je suis bien bloqué :'(, d'autant plus que je ne trouve pas de doc là
dessus sur le net.
|
|
| Back to top |
|
 |
LaFleche Guest
|
Posted: Fri Apr 16, 2004 12:44 am Post subject: Re: template imbriqué récalcitrant |
|
|
Matthieu Moy wrote:
| Quote: | LaFleche <altrash (AT) altern (DOT) org> writes:
## .H ##
template<typename S,template
class A
{
private : A<S> attribut;
};
Non. A est juste un template à deux arguments. Pas d'imbrication ici.
int main()
{
A<int, Truc obj;
}
Là, c'est bon.
Si tu définie des fonctions, tu peux faire
int f(int, int);
int g(int);
et appeler
f(3, g(4))
Sans le mentionner dans la déclaration.
|
Oui mais mon but ici c'est justement de controler que le deuxieme
argument soit bien une classe templété et que l'argument du template
soit le meme type que l'argument du template de G.
Bon ok exemple :
A<float, vector obj; ---> OK
A<int, vector obj; ---> ERREUR A LA COMPIL
Mais je ne suis pas sûr que ce soit possible en c++, ce qui n'arrange
pas les choses...
|
|
| Back to top |
|
 |
LaFleche Guest
|
Posted: Fri Apr 16, 2004 12:47 am Post subject: Re: template imbriqué récalcitrant |
|
|
Oups j'aui oublié de donner l'e msg d'erreur de g++ :
G.h:15: error: syntax error before `*' token
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Fri Apr 16, 2004 7:13 am Post subject: Re: template imbriqué récalcitrant |
|
|
LaFleche wrote:
| Quote: | Loïc Joly wrote:
// Template template
templete <class T, int i, template
class Dessin3
{
Vec<T, i> data;
Vec<T, 2> projectionOnPlane
}
Merci Loïc pour ta réponse,
Donc oui c'est bien ce que j'aimerai faire.
voici mon code (avec les corrections) : la déclaration des attributs ne
plaît pas du tout à g++ (sans les déclarations il compile).
--------
#include <vector
template
class G
{
private:
vector< A < S > > *a;
vector<S> *s;
...
};
|
La code suivant compile chez moi (dev C++/ gcc3.2) :
#include <vector>
using namespace std;
template<class S, template
class G
{
private:
vector< A < S > > *a;
vector<S> *s;
};
int main()
{
}
J'ai juste ajouté le using namespace... Comme quoi quand on est fixé sur
un problème, on ne voit pas trop ce qu'il y a a côté...
--
Loïc
|
|
| Back to top |
|
 |
Powered by phpBB © 2001, 2006 phpBB Group
|