我有一个模板化的类Foo,我想要输入智能指针。
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。 e.g。
template<typename T>
class Bar {
void do(typename Foo<T>::Ptr p);
}
这种语法有点麻烦,实际上写shared_ptr<Foo<T>>
还有其他选择吗?即一种在任何模仿T的上下文中声明Foo :: Ptr(甚至Foo :: Ptr)的方法? (例如在班级栏内?)
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) {
}
答案 0 :(得分: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 强>