从子类访问受保护的成员:gcc与msvc 在VisualC++中,我可以做这样的事情: template <class T> class A{ protected: T i; }; template <class T> class B : public A<T>{ T geti() {return i;} }; 模板 甲级{ 受保护的: TⅠ; }; 模板 B类:公共A{ T geti(){return i;} };
如果我试图用g++编译这个,我会得到一个错误。我必须这样做:从子类访问受保护的成员:gcc与msvc 在VisualC++中,我可以做这样的事情: template <class T> class A{ protected: T i; }; template <class T> class B : public A<T>{ T geti() {return i;} }; 模板 甲级{ 受保护的: TⅠ; }; 模板 B类:公共A{ T geti(){return i;} };,c++,gcc,g++,visual-c++,C++,Gcc,G++,Visual C++,如果我试图用g++编译这个,我会得到一个错误。我必须这样做: template <class T> class B : public A<T>{ T geti() {return A<T>::i;} }; 模板 B类:公共A{ T geti(){返回A::i;} }; 在标准C++中我不应该做前者吗?或者是gcc配置错误导致了错误?这过去是允许的,但在中有所改变 在模板定义中,不合格名称将不再找到依赖基的成员(如C++标准中的[ TEMP .DEP
template <class T>
class B : public A<T>{
T geti() {return A<T>::i;}
};
模板
B类:公共A{
T geti(){返回A::i;}
};
在标准C++中我不应该做前者吗?或者是gcc配置错误导致了错误?这过去是允许的,但在中有所改变
在模板定义中,不合格名称将不再找到依赖基的成员(如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
}
};
模板结构B{
int m;
int n;
intf();
int g();
};
int n;
int g();
模板结构C:B{
空位h()
{
m=0;//错误
f();//错误
n=0;/::n已修改
g();/::g被调用
}
};
您必须使名称相互依赖,例如,在名称前加上此->。下面是C::h的正确定义
template <typename T> void C<T>::h ()
{
this->m = 0;
this->f ();
this->n = 0
this->g ();
}
模板无效C::h()
{
这个->m=0;
这个->f();
此->n=0
这个->g();
}
我想出了这个办法:
显然,第一个例子不是有效的C++,MSVC采用它是不好的。在C++ FAQ Lite上有解决方案。 < P>你可能想读一下GCC的版本[P/P>:HEH…你一定是在我发邮件的同时发的。奇怪的是,msvc接受了这一点,尽管它是无效的(并且导致了奇怪的运行时错误)。我认为gcc和vc++的旧版本可能都支持错误的方式。但gcc选择了正确的方式,vc++选择了保持向后兼容性。