模板内模板的typedef

时间:2012-09-06 14:35:19

标签: c++ class templates typedef smart-pointers

  

可能重复:
  Where and why do I have to put the “template” and “typename” keywords?

我有一个类在创建对象时创建智能指针并将所需的类作为模板参数传递。我有另一个类需要在另一个类中使用该智能指针。

#include <iostream>
using namespace std;

//智能指针类

template<typename T>
class IntrusivePtr
{
public:
    IntrusivePtr()
    {
        cout << "IntrusivePtr()";
    }
};

//我需要智能指针的类,也是模板

template<typename T>
class A
{
public:
    A()
    {
        cout << "A()";
    }
    typedef IntrusivePtr< A<T> > my_ptr;
};

//使用智能指针的类。

template<typename T>
class B
{
public:
    B()
    {
        cout << "B()";
    }

    typedef A<T>::my_ptr x;
};



int main()
{
    B<int> ob;

    return 0;
}

这可以用c ++实现吗? 我知道新的C ++ 11支持typedef s这样的事情,但我使用的是旧标准:( 编译这个我得到了一些坏的错误:

  

C:\用户\ iuliuh \ typedef_template_class-集结桌面Qt_4_8_1_for_Desktop _-_ MSVC2008__Qt_SDK__Debug .. \ typedef_template_class \ main.cpp中:41:   错误:C2146:语法错误:缺少';'在标识符'x'之前

     

C:\用户\ iuliuh \ typedef_template_class-集结桌面Qt_4_8_1_for_Desktop _-_ MSVC2008__Qt_SDK__Debug .. \ typedef_template_class \ main.cpp中:41:   错误:C2146:语法错误:缺少';'在标识符'x'之前

     

C:\用户\ iuliuh \ typedef_template_class-集结桌面Qt_4_8_1_for_Desktop _-_ MSVC2008__Qt_SDK__Debug .. \ typedef_template_class \ main.cpp中:41:   错误:C4430:缺少类型说明符 - 假定为int。注意:C ++没有   支持default-int

编辑: 对不起,我更改了一些内容和错误代码。这就是我想要它的方式。遗憾

2 个答案:

答案 0 :(得分:3)

template<typename T>
class B
{
public:
    B()
    {
        cout << "B()";
    }

    typedef typename A< B >::my_ptr x;
};

您应该使用typename,因为my_prtdependent name

答案 1 :(得分:3)

您的问题是A<B>::my_ptr是一个dependend名称(它取决于B<T>,因此取决于模板参数T)。因此,编译器在解析模板时不知道它是应该是类型还是变量。在这种情况下,它假定my_ptr不是一种类型,除非你明确地告诉它。因此,您需要添加typename,就像编译器告诉您的那样:

typedef typename A< B >::my_ptr x;

有关更完整的解释look at this answer to a similar question