【发布时间】:2010-03-07 11:09:20
【问题描述】:
通常,当A 继承自B 时,A 的所有成员都会自动对B 的函数可见,例如
class A {
protected:
int a;
};
class B : public A {
int getA() {return a;}
//no need to use A::a, it is automatically visible
};
但是,当我使用模板继承时,此代码变得非法(至少在 gcc 中)
template<typename T>
class A {
protected:
int a;
};
template<typename T>
class B : public A<T> {
int getA() {return a;}
};
templt.cpp: In member function `int B<T>::getA()':
templt.cpp:9: error: `a' undeclared (first use this function)
templt.cpp:9: error: (Each undeclared identifier is reported only once for each
function it appears in.)
我必须做一个
class B : public A<T> {
using B::a;
int getA() {return a;}
};
class B : public A<T> {
using A<T>::a;
int getA() {return a;}
};
class B : public A<T> {
int getA() {return B::a;}
};
等等。就好像变量a被B的另一个变量隐藏了一样,如下情况:
class HiddenByOverload {void hidden(){}}
class HidesByOverload : public HiddenByOverload {
void hidden(int i) {} //different signature, now `hidden` is hidden
void usehidden() {
HiddenByOverload::hidden(); // I must expose it explicitly
}
}
为什么会这样?还有其他方法可以防止 C++ 隐藏父模板类的变量吗?
编辑:感谢大家的精彩讨论。我必须承认我没有遵循引用 C++ 标准段落的论点。如果不阅读实际来源,我很难理解它。
我能做的最好的总结讨论是引用“Python 之禅”中的一句话:
如果难以实施 解释一下,这(可能)是个坏主意。
【问题讨论】:
-
C++ FAQ Lite 是一个很好的信息来源。模板部分描述了这个问题:parashift.com/c++-faq-lite/templates.html#faq-35.19
-
@UncleBens 谢谢,我希望我能接受 cmets。我以为它会在那里,但没有找到。
-
我已向FAQ lite 作者发送了一封邮件:codepad.org/Rc9cUXzz。此外,缺陷报告被发送给 GCC,因为它没有正确处理这个问题,我认为:gcc.gnu.org/bugzilla/show_bug.cgi?id=43282