typedef类

时间:2013-11-15 14:06:19

标签: c++ class templates

我在工作中看到了以下代码

typedef int         real_type;
typedef vector<int> vector_type;


template <class ASD> class program_class
{
  public:
    typename ASD::vector_type member_func();
};


template <typename ASD> typename ASD::real_type program_class<ASD>::member_func()
{
    typedef typename ASD::real_type      R;
    typedef typename ASD::vector_type    V;

    return 123;
}

从概念上讲,我不明白返回类型如何这样陈述:typename ASD::real_type。原则上,这要求我们实例化ASD的类型是一类typedef,对吧?

我能看到一个如何实现这个目标的例子吗?

2 个答案:

答案 0 :(得分:1)

正确。使用这样的返回类型处理声明会导致实例化类模板ASD引用的任何内容(如果有)。

如果ASD中的成员声明有错误,那么编译器会在实例化ASD时抱怨嵌套的program_class< ASD >实例化失败。

答案 1 :(得分:1)

全局vector_type位于全局命名空间中。如果使用范围运算符::,则范围将更改为范围运算符的左侧,对于模板,范围为ASD且不再是全局范围。

这意味着,正如您所注意到的那样,ASD类(无论是什么)必须在其中定义自己的vector_typereal_type,否则编译器会给您一个错误


示例:

typedef int real_type;  // The global type alias
...

struct Foo
{
    typedef long real_type;  // The local type alias
    ...
};

program_class<Foo> my_program_object;

现在program_classreal_type Foo::real_type而不是全球::real_type

正如您在我的示例中所看到的,您可以使用不同的基类型,因为两个类型的别名彼此完全分开。