Précédent   Forum du club des développeurs et IT Pro > C et C++ > Outils pour C & C++ > C++Builder
C++Builder Environnement de développement RAD C++Builder. Avant de poster -> F.A.Q C++Builder, Sources C++Builder
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 06/11/2012, 15h19   #1
parabole33
Membre du Club
 
Homme sylvain
Technicien maintenance
Inscription : juillet 2009
Messages : 112
Détails du profil
Informations personnelles :
Nom : Homme sylvain
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Technicien maintenance
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : juillet 2009
Messages : 112
Points : 40
Points : 40
Par défaut Specialisation templace XE2

bonjour ,

J'ai un soucis sur les déclarations de template et spécialisation :

Dans ma class
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
class com {
public:
 
template <class T>
bool com::WriteCom(T str, int nBytesToWrite, int  &pBytesWritten) ;
template <> :cry::cry:
bool com::WriteCom<char>(char str, int nBytesToWrite, int  &pBytesWritten);
 
};
 
template <class T>
 bool com::WriteCom(T str, int nBytesToWrite, int  &pBytesWritten) {
 }
 
 template <>
 bool com::WriteCom<char>(char str, int nBytesToWrite, int  &pBytesWritten) {
 }
 
#endif
G une erreur de compilation
E2099 Spécialisation explicite autorisée seulement dans portée du fichier ou espace de nommage
Contexte d'analyseur complet
com.cpp(23): #include com.h
com.h(83): class com

Merci beaucoup pour vôtre aide !
parabole33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2012, 15h52   #2
parabole33
Membre du Club
 
Homme sylvain
Technicien maintenance
Inscription : juillet 2009
Messages : 112
Détails du profil
Informations personnelles :
Nom : Homme sylvain
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Technicien maintenance
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : juillet 2009
Messages : 112
Points : 40
Points : 40
hi !

G trouvé une partie du problème :

En validant l'option : compabilité : spécialisation de template de fonction membre

Plus d'erreurs de compil .

Pour l'appel de fonction pour arguments char , je suis obligé d'être explicite !!

Code :
1
2
3
4
5
6
7
 
 
char g = 40 ;
PortCom.WriteCo<char>(g,nBytesToWrite,nBytesToRead) ;   :cry::cry::(
 
wstring M = L"test" ;  :ccool::ccool:
PortCom.WriteCo(M,nBytesToWrite,nBytesToRead) ;
Auriez vous une idée ??

merci beaucoup !
parabole33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2012, 15h52   #3
ShaiLeTroll
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 9 202
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Développeur C++\Delphi
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : juillet 2006
Messages : 9 202
Points : 13 258
Points : 13 258
Tu spécialise la méthode WriteCom dans la même classe que la template ??
Cela dépasse mes pauvres connaissance de template !
Changer ce genre d'option, ce n'est pas mon truc, je fais tout pour éviter de tel extrémité !

Au final, si tu dois spécialiser explicitement, autant faire des méthode WriteChar, WriteInteger ... comme dans le TBinaryWriter
En plus c'est plus lisible, on voit tout de suite ce que fait WriteXXX, alors qu'avec un template, il faudra lire le type de la variable, pour la maintenance, je ne suis pas convaincu !

Tu fais ton propre composant pour le port COM ? tu sais qu'il en existe déjà et comme utilisé par bcp sont reconnus comme fiable !

wstring ?
Ne serait-il pas plus approprié en C++Builder d'utiliser String\UnicodeString ?
Tu pourrais même d'ailleurs créer une classe hérité de TStream pour gérer le Port COM, tu n'aurais à coder QUE la variante buffer *void
Ensuite, tu utilises un TBinaryWriter et TBinaryReader qui eux contient les variantes WriteChar, WriteString ...

Perso, je n'ai jamais fait de template avec juste une méthode template mais plutôt une classe entièrement template puis des classes de spécialisation

pour me simplifier la syntaxe, je fais un type intermédiaire indiquant le type templaté puis j'hérite de ce type pour y ajouter d'autres méthodes
(je t'ai simplifié les noms, voir le sujet Template et Héritage)

Code :
1
2
3
4
template<class T, typename A> // T doit hérité d'un TObject, A n'a pas de restriction particulière
class TTemplate : public TObjectList
{
   ...
Code :
1
2
3
4
typedef TTemplate<TMachin, TBidule>TSpecializationBaseTemplate;
class TSpecialization : public TSpecializationBaseTemplate
{
  ...
Code :
1
2
3
4
template<> // spécialisation
int TSpecializationBaseTemplate::Methode(TBidule* Variable)
{
  ...
Code :
1
2
3
4
typedef TTemplate<TTruc, TChose> TAutreSpecializationBaseTemplate;
class TAutreSpecialization : public TAutreSpecializationBaseTemplate
{
  ...
Code :
1
2
3
4
template<> // spécialisation
int TAutreSpecializationBaseTemplate::Methode(TChose* Variable)
{
  ...
__________________
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !

L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !
ShaiLeTroll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2012, 16h49   #4
parabole33
Membre du Club
 
Homme sylvain
Technicien maintenance
Inscription : juillet 2009
Messages : 112
Détails du profil
Informations personnelles :
Nom : Homme sylvain
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Technicien maintenance
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : juillet 2009
Messages : 112
Points : 40
Points : 40
merci beaucoup pour tout ces conseils .

Ce n'est uniquement à titre pédagogique
pour comprendre et assimiler le c++ et ces grands principes ......

Si je fais la spécialisation dans la class c'est le même code erreur .
E2099 Spécialisation explicite autorisée seulement dans portée du fichier ou espace de nommage

merci !
parabole33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 04h01.


 
 
 
 
Partenaires

Hébergement Web