У меня есть шаблонный шаблон Foo, из которого я хочу ввести typedef умные указатели.Вложенный тип в шаблонный класс
AFAIK Я не могу напечатать это вне класса. Код ниже (или его варианты) не будет работать.
template<typename T>
typedef shared_ptr< Foo<T> > Foo_Ptr<T>;
Таким образом, у меня есть typedefed shared_ptr и weak_ptr внутри класса.
template<typename T>
class Foo {
public:
typedef shared_ptr< Foo<T> > Ptr;
typedef weak_ptr< Foo<T> > WeakPtr;
};
Это раздражает, потому что я не могу переслать его сейчас в других заголовках.
Но мой вопрос в том, всякий раз, когда я хочу объявить Foo :: Ptr, я должен предшествовать ему с typename. например
template<typename T>
class Bar {
void do(typename Foo<T>::Ptr p);
}
Этот синтаксис немного громоздким, это на самом деле быстрее, чтобы написать shared_ptr<Foo<T>>
Есть ли альтернативы? То есть способ объявить Foo :: Ptr (или даже Foo :: Ptr) в любом контексте, который является шаблоном для T? (например, внутри класса Bar?)
EDIT.
Основываясь на ответ Дениса, я думал идти с этим
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> >;
foo.h
#include "types.h"
template<typename T>
class Foo {
public:
};
других
#include "Foo.h"
template<typename T>
void do_sth(Foo_Ptr<T> p) {
}
о том, что это здорово спасибо , Я не знал об этом синтаксисе «using». Из того, что я прочитал, это супермножество typedef, и я могу использовать его с шаблонами? Таким образом, я мог бы удалить shared_ptr typedef изнутри класса и оставить их снаружи? Я обновлю свой вопрос с помощью предлагаемого кода (он компилируется в проводнике компилятора) – memo