OVH Cloud OVH Cloud

template et visual c++

11 réponses
Avatar
Godot
Bonjour,

En écrivant des templates sous visual c++ 6, j'ai procédé de la façon
suivante

Fichier a.hpp :
----------------------------------
template <class T> class A
{
};

#include "a.cpp"
-----------------------------------

Histoire de séparer l'implémentation du template de sa définition. Seulement
lors du link, le compilateur essaie aussi de compiler séparément a.cpp ce
qui entraîne évidemment des erreurs de compilation.
Le problème ne se pose pas lorsque j'enlève le fichier a.cpp de la liste des
fichiers du projet mais j'aimerais bien que a.cpp y apparaisse et ne soit
pas compilé. Comment faire ?
Merci pour vos suggestions.

10 réponses

1 2
Avatar
Cyrille Szymanski
> Fichier a.hpp :
----------------------------------
template <class T> class A
{



<insère ici les prototypes/définitions de champs>
exemple :
int foo( double bar, class T );

};

#include "a.cpp"



non, on compile les cpp, in inclut les hpp, pas l'inverse et ce pour
les raisons que tu viens d'évoquer.

--
cns
Avatar
Cyrille Szymanski
> Fichier a.hpp :
----------------------------------
template <class T> class A



mieux : template< typename T >

{



<insère ici les prototypes/définitions de champs>
exemple :
int foo( double bar, typename T );

};

#include "a.cpp"



non, on compile les cpp, in inclut les hpp, pas l'inverse et ce pour
les raisons que tu viens d'évoquer.

--
cns
Avatar
Godot
"Cyrille Szymanski" a écrit dans le message de
news:4097ba94$0$12732$

| non, on compile les cpp, in inclut les hpp, pas l'inverse et ce pour
| les raisons que tu viens d'évoquer.

Je ne crois pas que l'implantation de template puisse être précompilée et
linkée comme des cpp ordinaires.
Avatar
Arnaud Debaene
Godot wrote:
Bonjour,

En écrivant des templates sous visual c++ 6, j'ai procédé de la façon
suivante

Fichier a.hpp :
----------------------------------
template <class T> class A
{
};

#include "a.cpp"
-----------------------------------

Histoire de séparer l'implémentation du template de sa définition.
Seulement lors du link, le compilateur essaie aussi de compiler
séparément a.cpp ce qui entraîne évidemment des erreurs de
compilation.
Le problème ne se pose pas lorsque j'enlève le fichier a.cpp de la
liste des fichiers du projet mais j'aimerais bien que a.cpp y
apparaisse et ne soit pas compilé. Comment faire ?



Dans les propriétés du projet : sélectionner le fichier et Action : "Ne pas
compiler".

PS : bien sûr, le .hpp doit être inclus quelque part.

Arnaud
Avatar
Godot
"Arnaud Debaene" a écrit dans le message de
news:40988765$0$8649$

| Dans les propriétés du projet : sélectionner le fichier et Action : "Ne
pas
| compiler".

Bah merci c'est l'info que je cherchais. Décidément, je ne m'y ferai jamais
aux IDE.
Avatar
Cyrille Szymanski
On 2004-05-05, Godot wrote:
Je ne crois pas que l'implantation de template puisse être précompilée et
linkée comme des cpp ordinaires.



Oui et c'est pour ça qu'on les met soit dans les entêtes (si elles
sont à portée globale) soit directement dans le fichier
d'implémentation qui les utilise.

--
cns
Avatar
Godot
"Cyrille Szymanski" a écrit dans le message de
news:4098c804$0$27668$
| On 2004-05-05, Godot wrote:
| > Je ne crois pas que l'implantation de template puisse être précompilée
et
| > linkée comme des cpp ordinaires.
|
| Oui et c'est pour ça qu'on les met soit dans les entêtes (si elles

Au cas où tu n'aurais pas encore compris, c'est ce que je voulais faire.

PS : merci pour le mini cours de c++ mais je pense assez bien connaître le
langage...( que j'ai au passage enseigné )
Avatar
Cyrille Szymanski
On 2004-05-05, Godot wrote:
Au cas où tu n'aurais pas encore compris, c'est ce que je voulais faire.



Quel est le problème avec le fait de mettre l'implémentation d'une
template dans un .hpp ? (Ah si, BCC sort des messages idiots du genre
"functions containing for/while are not expanded inline" mais pas les
autres)

PS : merci pour le mini cours de c++



De rien.

mais je pense assez bien connaître le langage...( que j'ai au
passage enseigné )



PS : Je m'excuse. Faut-il rappeler que ce ng est lu par de nombreux
débutants, que ça ne fait pas de mal d'expliciter les choses et enfin
que je ne te connais pas plus que tu me connais.

--
cns
Avatar
Godot
"Cyrille Szymanski" a écrit dans le message de
news:40991ad4$0$31936$
| On 2004-05-05, Godot wrote:
| Quel est le problème avec le fait de mettre l'implémentation d'une
| template dans un .hpp ? (Ah si, BCC sort des messages idiots du genre
| "functions containing for/while are not expanded inline" mais pas les
| autres)

C'est juste une question de goût personnel. Je trouve ainsi que le code est
plus lisible et l'utilisateur d'une classe template n'a pas forcément envie
d'en voir l'implantation.
Par exemple, tu pourrais essayer de jeter un coup aux fichiers vector,
string et consort de la STL ( du moins celle de gcc ) pour me dire si tu
trouves ça lisible pour un débutant ou même un programmeur qui veut juste
savoir quelles méthodes il peut appeler pour telle classe.
Ceci dit, la lisibilité du code n'est pas forcément une priorité pour bien
des programmeurs.
Avatar
Cyrille Szymanski
On 2004-05-05, Godot wrote:
| Quel est le problème avec le fait de mettre l'implémentation d'une
| template dans un .hpp ?

C'est juste une question de goût personnel. Je trouve ainsi que le code est
plus lisible et l'utilisateur d'une classe template n'a pas forcément envie
d'en voir l'implantation.



Oui oui, je parlais bien de séparer l'implémentation de la définition,
mais dans deux .h différents.

Certains poussent le vice jusqu'à utiliser .h pour les définitions et
.hpp pour les implémentations afin de garder le même nom de base.
D'autres pré/post-fixent le nom de base.


Par exemple, tu pourrais essayer de jeter un coup aux fichiers vector,
string et consort de la STL ( du moins celle de gcc ) pour me dire si tu
trouves ça lisible pour un débutant ou même un programmeur qui veut juste
savoir quelles méthodes il peut appeler pour telle classe.



Connaissant +/- celle de gcc je suis allé voir celle de la réputé
stlport, on est d'accord sur le fait qu'il manque un bon fichier
d'interface. Mais celle de sgi est relativement propre. Il me semble
que c'est celle qui est dans VC++ (et sur laquelle stlport est basée) ?

--
cns
1 2