当一个模板类继承自另一个模板类时,基类中的typedef必须重新定义(即它们不会自动继承),并且基类中的函数调用需要限定作用域。为什么?这难道不已经很明确了吗?
例如,如果我有20个模板类,所有模板类都定义相同的typedef,我无法引入一个包含这些定义的基类并从中继承,因为我仍然需要在每个类中重新定义typedef,这使源代码变得非常冗长。
我看到在这个question中已经讨论过这个问题了,但是我不理解评论。
``` C++的名称查找规则指定,仅当名称依赖于模板参数(如果它是“依赖名称”)时才在模板化的基类中搜索名称。如果名称不依赖于模板参数,则不会在那里搜索。 ```
这是为什么?这对我来说毫无意义。
也许,下面的代码片段能更好地阐明我的问题:
例如,如果我有20个模板类,所有模板类都定义相同的typedef,我无法引入一个包含这些定义的基类并从中继承,因为我仍然需要在每个类中重新定义typedef,这使源代码变得非常冗长。
我看到在这个question中已经讨论过这个问题了,但是我不理解评论。
``` C++的名称查找规则指定,仅当名称依赖于模板参数(如果它是“依赖名称”)时才在模板化的基类中搜索名称。如果名称不依赖于模板参数,则不会在那里搜索。 ```
这是为什么?这对我来说毫无意义。
也许,下面的代码片段能更好地阐明我的问题:
#include <iostream>
template <unsigned N, typename T>
struct A
{
typedef T U;
static void foo(T x) { std::cout << N + x << "\n"; }
};
template <unsigned N, typename T>
struct B : public A<N, T>
{
// Why do I have to redeclare U? Isn't is unambiguous already?
typedef typename A<N, T>::U U;
// why do I have to specify B::? Isn't it unambiguous already?
static void zoo(U x) { B::foo(x); }
};
int main()
{
B<2,int>().zoo(3);
B<2,double>().zoo(3.5);
return 0;
}
typename base_type::
。表达式变得冗长,充斥着无用的关键字。 - Fabio