在visual C ++中,我可以这样做:
template <class T>
class A{
protected:
T i;
};
template <class T>
class B : public A<T>{
T geti() {return i;}
};
如果我尝试用g ++编译它,我会收到错误。我必须这样做:
template <class T>
class B : public A<T>{
T geti() {return A<T>::i;}
};
我不应该在标准C ++中使用前者吗?或者是gcc错误配置给我错误的东西?
答案 0 :(得分:6)
过去曾允许这样做,但在gcc 3.4中已更改。
在模板定义中,非限定名称将不再找到依赖库的成员(由C ++标准中的[temp.dep] / 3指定)。例如,
template <typename T> struct B {
int m;
int n;
int f ();
int g ();
};
int n;
int g ();
template <typename T> struct C : B<T> {
void h ()
{
m = 0; // error
f (); // error
n = 0; // ::n is modified
g (); // ::g is called
}
};
您必须依赖名称,例如通过在它们前面加上这个 - >;以下是C :: h,
的更正定义 template <typename T> void C<T>::h ()
{
this->m = 0;
this->f ();
this->n = 0
this->g ();
}
答案 1 :(得分:3)
我想出了这个:
显然,第一个例子不是有效的C ++,而且msvc采取这种做法很糟糕。在C ++ faq lite上发布了解决方案。
答案 2 :(得分:0)
您可能想了解two-phase name lookup