J'ai une classe Foo modèle, dont je veux typedef pointeurs intelligents. Autant que je sache, je ne peux pas le dactylographier en dehors de la classe. Le code ci-dessous (ou ses variantes) ne fonctionnera pas. Donc, j'ai typedefed shared_ptr et weak_ptr à l'intérieur de la classetype imbriqué dans la classe modèle
template<typename T>
class Foo {
public:
typedef shared_ptr< Foo<T> > Ptr;
typedef weak_ptr< Foo<T> > WeakPtr;
};
Ce qui est ennuyeux parce que je ne peux pas transmettre le déclarer maintenant dans d'autres en-têtes. Mais ma question est, chaque fois que je veux déclarer un Foo :: Ptr, je dois le précéder de typename. par exemple.
template<typename T>
class Bar {
void do(typename Foo<T>::Ptr p);
}
Cette syntaxe est un peu encombrant, il est en fait plus rapide à écrire shared_ptr<Foo<T>>
Y at-il des alternatives? C'est à dire. une manière de déclarer Foo :: Ptr (ou même Foo :: Ptr) dans n'importe quel contexte qui est modélisé à T? (par exemple à l'intérieur de la classe Bar?)
EDIT.
Sur la base de la réponse de Denis, je pense à aller avec ce
types.h
template<typename T>
class Foo;
template<typename T>
using Foo_Ptr = std::shared_ptr< Foo<T> >;
template<typename T>
class Bar;
template<typename T>
using Bar_Ptr = std::shared_ptr< Bar<T> >;
.h
#include "types.h"
template<typename T>
class Foo {
public:
};
ailleurs
#include "Foo.h"
template<typename T>
void do_sth(Foo_Ptr<T> p) {
}
oh c'est grand merci . Je n'étais pas au courant de cette syntaxe «using» alias. D'après ce que j'ai lu c'est un surensemble de typedef, et je peux l'utiliser avec des modèles? Donc, je pourrais enlever le typedefs shared_ptr de l'intérieur de la classe et les avoir tous à l'extérieur? Je vais mettre à jour ma question avec le code proposé (il compile dans l'explorateur du compilateur) – memo