Ce code n'est pas valide ?Code:template<class _I> void foo(_I i, unsigned _I ui);
unsigned _I ne plait pas au compilateur (VC++6).
Version imprimable
Ce code n'est pas valide ?Code:template<class _I> void foo(_I i, unsigned _I ui);
unsigned _I ne plait pas au compilateur (VC++6).
Il me semble qu'il faille passer par un typedef, car ton type étant composé le compilo guele,
ma réponse provenant d'une bribe de mémoire je n'en suis pas sur a 100%..
Salut,
Pour te permettre de comprendre pourquoi ton compilateur refuse la déclaration d'un argument sous la forme de unsigned _I, pose toi simplement la question de savoir ce que représente _I de manière générale (donc, avant que tu ne donne la moindre précision sur ce que c'est :D), et, surtout, dans quel cas (avec quel types) le mot clé unsigned est applicable ;)
Si tu n'arrive pas à trouver de réponse satisfaisante, je te la donnerai, mais, dans un premier temps, il semble utile que tu y réfléchisse par toi même :D
Cela va sans dire que _I ne pourra être que du genre char, short, int, long, __int64... bref un type primitif. Mais manifestement il faut que je le dise. Oui, j'ai compris que "unsigned MyClass" n'a pas de sens (quoique...), mais je veux bien que le compilateur rouspête, éventuellement, si le type n'est pas primitif, lors de l'instantiation du template et non pas lors de sa déclaration.
Maintenant que c'est dit, pourquoi je peux pas faire ce genre de template ?
Merci.
Pour te convaincre de tout ça, essaye de faire "joujou" avec ça :
Code:
1
2
3
4
5 template <typename T> struct make_unsigned { typedef unsigned T type; };
A mon avis, ce qu'il faut comprendre, c'est que 'unsigned XXX' désigne un type bien défini. 'unsigned' n'est pas vraiment un qualificatif sur le type (comme const par exemple), mais a bien pour objectif de définir un type bien spécifié.
Néanmoins, boost est ton ami : make_unsigned
Code:
1
2
3 template<class _I> void foo(_I i,typename boost::make_unsigned<_I>::type ui)