[C++] Templates

Templates [C++] - Programmation

Marsh Posté le 16-02-2002 à 13:14:37    

Une petite question sur les templates:
 
j'ai une methode :
 
template <typename T>
T  getValue(const std::string &group, const std::string &key, const T & valueByDefault)
 
le probleme c'est que j'aimerais faire plutot ca :
template <typename T>
T  getValue(const std::string &group, const std::string &key, const T & valueByDefault = T())
 
càd que la default value a une valeur par defaut  :)  
 
Le probleme c'est que VC++ 6 me sort une erreur
error C2065: 'T' : undeclared identifier  
quand je rajoute le = T()
 
du coup j'ai rien trouvé d'autre comme solution que de surcharger la 1ere methode par un
 
template <typename T>
T  getValue(const std::string &group, const std::string &key)
{
...
if (pasTrouve)
   return T();
}
 
ce qui n'est pas tres elegant, je vous le concede.
 
Ce qui me surprend le plus c'est que le meme compilo, compile sans probleme ca (tiré de la declaration de la map de la stl):
 
explicit map(const _Pr& _Pred = _Pr(), const _A& _Al = _A())
  : _Tr(_Pred, false, _Al) {}
 
Donc si qcq a une idee jsuis preneur.

Reply

Marsh Posté le 16-02-2002 à 13:14:37   

Reply

Marsh Posté le 17-02-2002 à 10:37:42    

ptit up du matin

Reply

Marsh Posté le 17-02-2002 à 10:47:37    

Aucun pb avec g++ ou VC++7.

Reply

Marsh Posté le 17-02-2002 à 10:58:38    

:( c'est bien ce que je craignais, faut que je change de compilo moa, le VC++ 7 est encore dispo en dl beta sur le site de crosoft ?

Reply

Marsh Posté le 18-02-2002 à 15:02:51    

wpk a écrit a écrit :

Une petite question sur les templates:
 
j'ai une methode :
 
template <typename T>
T  getValue(const std::string &group, const std::string &key, const T & valueByDefault)
 
le probleme c'est que j'aimerais faire plutot ca :
template <typename T>
T  getValue(const std::string &group, const std::string &key, const T & valueByDefault = T())
 
càd que la default value a une valeur par defaut  :)  
 
Le probleme c'est que VC++ 6 me sort une erreur
error C2065: 'T' : undeclared identifier  
quand je rajoute le = T()
 
du coup j'ai rien trouvé d'autre comme solution que de surcharger la 1ere methode par un
 
template <typename T>
T  getValue(const std::string &group, const std::string &key)
{
...
if (pasTrouve)
   return T();
}
 
ce qui n'est pas tres elegant, je vous le concede.
 
Ce qui me surprend le plus c'est que le meme compilo, compile sans probleme ca (tiré de la declaration de la map de la stl):
 
explicit map(const _Pr& _Pred = _Pr(), const _A& _Al = _A())
  : _Tr(_Pred, false, _Al) {}
 
Donc si qcq a une idee jsuis preneur.  




 
L'erreur ne vient pas de ton type template mais du fait que tu utilises un passage par reference dans la déclaration du type de ton dernier paramètre. Supprime le & et cela fonctionne:
 
template <typename T>
T  getValue(const std::string &group,  
            const std::string &keyconst ,
            T  valueByDefault = T());
 
Avec VC++ 6.0 ca compile chez moi.

Reply

Marsh Posté le 18-02-2002 à 17:14:12    

:jap: ah, j'y avais pas pensé d'essayer de passer par valeur.
Mais ce que je ne comprends pas c'est pourquoi dans le cas de la map par exemple
explicit map(const _Pr& _Pred = _Pr(), const _A& _Al = _A())  
 : _Tr(_Pred, false, _Al) {}  
 
, le compilo accepte le type de construction qu'il me refuse à moi (du moment ou sur le type T je lui fournis un ctor par defaut & un operateur de recopie, il devrait pouvoir construire mon T).
 
Y'a ptetre un autre probleme en fait : c'est qu'à l'instantiation
de la methode template, le seul discriminant qui reste si on passe par defaut, c'est la valeur de retour...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed