【发布时间】:2016-01-04 03:38:12
【问题描述】:
我正在尝试从模板公开派生一个类,使其继承自基类并获得对受保护成员的访问权限。但是在扩展模板之前它没有这些权限,所以它不能使用 Base 成员作为模板参数:
using Fun = void (*)();
class Base {
protected:
// friend class Derived; // ...need this to eliminate complaint
static void something();
};
template<Fun F>
class Variant : public Base {};
class Derived : public Variant<&Base::something> { // `something()` is protected
public:
void somethingElse() {
something(); // doesn't complain about this `something()`
}
};
int main() {}
对我来说,这件事的奇怪之处在于交友它完全有效。我想知道我是否可以通过将来自 Base 的公共虚拟继承放在 Variant 之前“偷偷摸摸”:
class Derived : public virtual Base, public Variant<&Base::something>
这没有帮助。
问题:是否有其他技巧可以避免显式提及 Base 中的所有派生类,但仍然可以从中挑选受保护的成员作为模板参数?
(注意:在较旧的 gcc 4.6.3 上尝试此操作,在这种情况下看起来即使是加好友也无济于事。所以似乎对此的支持有点新。) p>
【问题讨论】:
-
@dyp 我想这可能是“答案”或者我们将得到的最接近的答案。想做一个吗?
标签: c++ templates inheritance protected