Templates [C++] - Programmation
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 ?
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.
Marsh Posté le 18-02-2002 à 17:14:12
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...
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.