2016-01-29 4 views
0

У меня есть шаблонный шаблон 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) { 
} 

ответ

3

You может ввести псевдоним с using вроде STDLIB делает это для type_traits (like std_enable_if_t), которые не требуют TYPENAME ключевого слова:

using foo_ptr_t = typename Node<T>::Ptr; 

Возможный пример является:

#include <memory> 

template<typename> 
struct Foo { }; 

template<typename T> 
class Node { 
public: 
    typedef std::shared_ptr<Foo<T>> Ptr; 
    typedef std::weak_ptr<Foo<T>> WeakPtr; 
}; 

template<typename T> 
using foo_ptr_t = typename Node<T>::Ptr; 

void do_sth(foo_ptr_t<int> p) { } 

Demo

+0

о том, что это здорово спасибо , Я не знал об этом синтаксисе «using». Из того, что я прочитал, это супермножество typedef, и я могу использовать его с шаблонами? Таким образом, я мог бы удалить shared_ptr typedef изнутри класса и оставить их снаружи? Я обновлю свой вопрос с помощью предлагаемого кода (он компилируется в проводнике компилятора) – memo

Смежные вопросы