Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在扩展从中派生的模板之前访问模板的基类_C++_Templates_Inheritance_Protected - Fatal编程技术网

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我认为这可能是“答案”或我们将得到的最接近的答案。想让它成为一个吗?