0

可能重复:
我必须在哪里以及为什么要放置“模板”和“类型名称”关键字?

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

#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 支持typedefs 这样的事情,但我使用的是旧标准 :( 编译这个我遇到了一些糟糕的错误:

C:\Users\jacob\typedef_template_class-build-desktop-Qt_4_8_1_for_Desktop_-_MSVC2008__Qt_SDK__Debug..\typedef_template_class\main.cpp:41:错误:C2146:语法错误:缺少';' 在标识符“x”之前

C:\Users\jacob\typedef_template_class-build-desktop-Qt_4_8_1_for_Desktop_-_MSVC2008__Qt_SDK__Debug..\typedef_template_class\main.cpp:41:错误:C2146:语法错误:缺少';' 在标识符“x”之前

C:\Users\jacob\typedef_template_class-build-desktop-Qt_4_8_1_for_Desktop_-_MSVC2008__Qt_SDK__Debug..\typedef_template_class\main.cpp:41:错误:C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持默认整数

编辑:对不起,我改变了一些东西和错误代码。这就是我想要的样子。对不起

4

2 回答 2

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

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

你应该使用typename,因为my_prtdependent name

于 2012-09-06T14:37:30.203 回答
3

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

typedef typename A< B >::my_ptr x;

有关更完整的解释,请查看类似问题的答案

于 2012-09-06T14:43:38.317 回答