Cette question concerne le fait que mon dernier one. J'essaie de résoudre le problème en utilisant traits<T>
et traits<T*>
. S'il vous plaît considérer le code suivant.Utiliser des traits en C++
template<typename T>
struct traits
{
typedef const T& const_reference;
};
template<typename T>
struct traits<T*>
{
typedef const T const_reference;
};
template<typename T>
class test
{
public:
typedef typename traits<T>::const_reference const_reference;
test() {}
const_reference value() const {
return f;
}
private:
T f;
};
int main()
{
const test<foo*> t;
const foo* f = t.value(); // error here. cannot convert ‘const foo’ to ‘const foo*’ in initialization
return 0;
}
Il semble donc que le compilateur ne considère pas les traits de spécialisation pour les pointeurs et prendre type de retour de value()
comme const foo
plutôt que const foo*
. Qu'est-ce que je fais mal ici?
Toute aide serait géniale!
Je me sens dump :(Mais, T lui-même est un pointeur ('foo *'). Donc spécifier 'T * 'mènera dans' T ** '? –
No. Dans la spécialisation' traits ', T 'n'est pas un pointeur,' T * 'est un pointeur.Si vous utilisez le même paramètre typename est sans conséquence –
outis
OK.Merci.Il est logique maintenant .. –