C++ 在扩展从中派生的模板之前访问模板的基类
我正试图从一个模板公开派生一个类,该模板将使它从基类继承并访问受保护的成员。但在展开模板之前,它没有这些权限,因此不能将基础成员用作模板参数:C++ 在扩展从中派生的模板之前访问模板的基类,c++,templates,inheritance,protected,C++,Templates,Inheritance,Protected,我正试图从一个模板公开派生一个类,该模板将使它从基类继承并访问受保护的成员。但在展开模板之前,它没有这些权限,因此不能将基础成员用作模板参数: using Fun = void (*)(); class Base { protected: // friend class Derived; // ...need this to eliminate complaint static void something(); }; template<Fun F> class
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() {}
使用Fun=void(*)();
阶级基础{
受保护的:
//派生的friend类;/…需要此项来消除投诉
静态空某物();
};
模板
类变量:公共基{};
派生类:公共变量{/`something()`受保护
公众:
使某物无效{
something();//不抱怨这个'something()`
}
};
int main(){}
对我来说,这件事有一点奇怪,那就是交朋友根本不管用。我想知道我是否可以通过将一个来自Base的公共虚拟继承放在变体之前来“偷偷地从门中派生”:
class Derived : public virtual Base, public Variant<&Base::something>
派生类:公共虚拟基,公共变量
那没用
问题:是否有其他技巧可以避免在基类中显式提及所有派生类,但仍然可以从中为模板参数选择受保护的成员
(注意:在较旧的gcc 4.6.3上尝试这一点,在这种情况下,即使是交友也无济于事。因此,对这一点的支持似乎有些新。)将有问题的访问粘贴到元函数中。从基派生元函数类
template<typename B>
struct something_variant : public B {
typedef Variant< & B::something > type;
};
class Derived : public something_variant<Base>::type {
…
模板
struct something_变量:public B{
typedef变量<&B::something>type;
};
派生类:public something\u variant::type{
…
关于CWG 372,决议中的关键文本如下:
[A] 必须推迟基本说明符的成功检查,直到看到整个基本说明符列表
这一点在C++11中已经被接受,所以有趣的是,您的示例被拒绝了。而且,从C++11标准到最近的Clang和GCC的相关示例代码表明,他们根本没有实现延迟。这至少有点不足为奇,因为实现需要一些数据结构来表示一组延迟ed访问检查…对于一个角落案例,付出了相当大的努力。相关:和。似乎即使是当前版本的clang++和g++也没有实现针对后一个缺陷的建议解决方案。@dyp我认为这可能是“答案”或我们将得到的最接近的答案。想让它成为一个吗?