我在工作中看到了以下代码
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,对吧?
我能看到一个如何实现这个目标的例子吗?
答案 0 :(得分:1)
正确。使用这样的返回类型处理声明会导致实例化类模板ASD
引用的任何内容(如果有)。
如果ASD
中的成员声明有错误,那么编译器会在实例化ASD
时抱怨嵌套的program_class< ASD >
实例化失败。
答案 1 :(得分:1)
全局vector_type
位于全局命名空间中。如果使用范围运算符::
,则范围将更改为范围运算符的左侧,对于模板,范围为ASD
且不再是全局范围。
这意味着,正如您所注意到的那样,ASD
类(无论是什么)必须在其中定义自己的vector_type
和real_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_class
内real_type
Foo::real_type
而不是全球::real_type
。
正如您在我的示例中所看到的,您可以使用不同的基类型,因为两个类型的别名彼此完全分开。