Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板化类中的嵌套类型_C++_Templates_Types - Fatal编程技术网

C++ 模板化类中的嵌套类型

C++ 模板化类中的嵌套类型,c++,templates,types,C++,Templates,Types,我有一个模板类Foo,我想在其中键入def智能指针 好吧,我不能在课外打这个。下面的代码(或其变体)不起作用 template<typename T> typedef shared_ptr< Foo<T> > Foo_Ptr<T>; 模板 typedef共享_ptrFoo_ptr; 因此,我在类中键入了shared_ptr和weak_ptr template<typename T> class Foo { public:

我有一个模板类Foo,我想在其中键入def智能指针

好吧,我不能在课外打这个。下面的代码(或其变体)不起作用

template<typename T>
typedef shared_ptr< Foo<T> > Foo_Ptr<T>; 
模板
typedef共享_ptrFoo_ptr;
因此,我在类中键入了shared_ptr和weak_ptr

template<typename T>
class Foo {
public:
    typedef shared_ptr< Foo<T> > Ptr;
    typedef weak_ptr< Foo<T> > WeakPtr;
};
模板
福班{
公众:
typedef共享_ptrptr;
typedef弱_ptrWeakPtr;
};
这很烦人,因为我现在不能在其他标题中转发声明它

但我的问题是,每当我想要声明一个Foo::Ptr时,我必须在它前面加上typename。e、 g

template<typename T>
class Bar {
   void do(typename Foo<T>::Ptr p);
}
模板
分类栏{
void do(类型名Foo::Ptr p);
}
这种语法有点麻烦,实际上编写
shared\u ptr

还有其他选择吗?即,在模板化为T的任何上下文中声明Foo::Ptr(甚至Foo::Ptr)的方法?(例如,在类栏内?)


编辑

根据丹尼斯的回答,我正在考虑这样做

类型.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类;
模板
使用Foo_Ptr=std::shared_Ptr;
模板
分类栏;
模板
使用Bar_Ptr=std::shared_Ptr
福安

#包括“types.h”
模板
福班{
公众:
};
别处

#include "Foo.h"

template<typename T>
void do_sth(Foo_Ptr<T> p) {
}
#包括“Foo.h”
模板
无效做某事(Foo_Ptr p){
}

您可以使用
引入别名,就像stdlib为type_traits()引入别名一样,它不需要typename关键字:

using foo_ptr_t = typename Node<T>::Ptr;
使用foo_ptr_t=typename节点::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) { }
#包括
模板
结构Foo{};
模板
类节点{
公众:
typedef std::共享\u ptr ptr;
typedef标准::弱ptr弱ptr;
};
模板
使用foo_ptr_t=typename节点::ptr;
无效做某事

您可以使用
引入别名,就像stdlib为type_traits()引入别名一样,它不需要typename关键字:

using foo_ptr_t = typename Node<T>::Ptr;
使用foo_ptr_t=typename节点::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) { }
#包括
模板
结构Foo{};
模板
类节点{
公众:
typedef std::共享\u ptr ptr;
typedef标准::弱ptr弱ptr;
};
模板
使用foo_ptr_t=typename节点::ptr;
无效做某事

哦,太好了,谢谢。我不知道这种“使用”别名语法。据我所知,它是typedef的超集,我可以将它与模板一起使用?这样我就可以从类内部删除共享的\u ptr typedef,并将它们全部放在外部?我将用建议的代码更新我的问题(它在编译器资源管理器中编译)哦,太好了,谢谢。我不知道这种“使用”别名语法。据我所知,它是typedef的超集,我可以将它与模板一起使用?这样我就可以从类内部删除共享的\u ptr typedef,并将它们全部放在外部?我将用建议的代码更新我的问题(它在编译器资源管理器中编译)