2016-01-29 165 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>>

有什麼辦法?即在任何模板化爲T的上下文中聲明Foo :: Ptr(甚至是Foo :: Ptr)的方法? (例如,Bar類內?)


編輯。

根據丹尼斯的回答,我想用這個

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

你去可以引入一個別名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

哦,這是偉大的感謝。我不知道這種「使用」別名語法。從我讀過的這是一個typedef的超集,我可以在模板中使用它?所以我可以從類內部移除shared_ptr typedefs並將它們全部放在外面?我將用建議的代碼更新我的問題(它在編譯器資源管理器中編譯) – memo