又发现一个诡秘的地方
模板派生类(下面的D) 从一个 确定性基类(指B)继承,
在D的定义中, 编译器优先查找基类中的名字, 然后才是模板参数placeholder (即Type) .
例如:
struct B
{
typedef int Type; //基类中有一个Type名字
};
template<class Type>
class D : public B //从非依赖基类B派生,
{
public:
Type i; //Type既可以是模板参数, 有可能是基类B中被typedef的int, 优先选择后者
};
int main()
{
D<char> d;
d.i = 29; //d.i 的确切类型应该是 B中定义的 int, 而不是模板实参指定的char.
return 0;
}
VC7.1 确实如此.
这样, 是否造成一种现象,就是如果一个模板类需要继承一个普通的基类,它在确定模板参数名字的时候还要考虑
到基类中去看看有没有同名冲突?
或者使用一种防御性的模板参数命名方法,即仅仅将模板参数命名为T, U这样的简单类型?
模板派生类(下面的D) 从一个 确定性基类(指B)继承,
在D的定义中, 编译器优先查找基类中的名字, 然后才是模板参数placeholder (即Type) .
例如:
struct B
{
typedef int Type; //基类中有一个Type名字
};
template<class Type>
class D : public B //从非依赖基类B派生,
{
public:
Type i; //Type既可以是模板参数, 有可能是基类B中被typedef的int, 优先选择后者
};
int main()
{
D<char> d;
d.i = 29; //d.i 的确切类型应该是 B中定义的 int, 而不是模板实参指定的char.
return 0;
}
VC7.1 确实如此.
这样, 是否造成一种现象,就是如果一个模板类需要继承一个普通的基类,它在确定模板参数名字的时候还要考虑
到基类中去看看有没有同名冲突?
或者使用一种防御性的模板参数命名方法,即仅仅将模板参数命名为T, U这样的简单类型?