C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

template imbriqué récalcitrant

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
LaFleche
Guest





PostPosted: Fri Apr 09, 2004 10:40 pm    Post subject: template imbriqué récalcitrant Reply with 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 Sad.
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





PostPosted: Fri Apr 09, 2004 10:44 pm    Post subject: Re: template imbriqué récalcitrant Reply with quote



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





PostPosted: Sat Apr 10, 2004 8:36 am    Post subject: Re: template imbriqué récalcitrant Reply with quote



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





PostPosted: Sat Apr 10, 2004 11:52 am    Post subject: Re: template imbriqué récalcitrant Reply with quote

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 Sad.
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





PostPosted: Fri Apr 16, 2004 12:36 am    Post subject: Re: template imbriqué récalcitrant Reply with quote

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





PostPosted: Fri Apr 16, 2004 12:44 am    Post subject: Re: template imbriqué récalcitrant Reply with quote

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





PostPosted: Fri Apr 16, 2004 12:47 am    Post subject: Re: template imbriqué récalcitrant Reply with quote

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





PostPosted: Fri Apr 16, 2004 7:13 am    Post subject: Re: template imbriqué récalcitrant Reply with quote

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
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
 


Powered by phpBB © 2001, 2006 phpBB Group