Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.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++ 带模板基类的菱形继承:base<;派生>;_C++_Templates_Inheritance_Diamond Problem - Fatal编程技术网

C++ 带模板基类的菱形继承:base<;派生>;

C++ 带模板基类的菱形继承:base<;派生>;,c++,templates,inheritance,diamond-problem,C++,Templates,Inheritance,Diamond Problem,当从以派生类作为模板参数的模板基类继承时,我遇到了菱形问题 通常,通过如下虚拟继承可以解决此问题: class Base0 { protected: int var = 0; }; class Base1 : public virtual Base0 { }; class Base2 : public virtual Base0 { }; class Derived : public Base1, public Base2 { public: void f

当从以派生类作为模板参数的模板基类继承时,我遇到了菱形问题

通常,通过如下虚拟继承可以解决此问题:

class Base0
{
protected:
    int var = 0;
};

class Base1 : public virtual Base0
{
};

class Base2 : public virtual Base0
{

};

class Derived :
    public Base1,
    public Base2
{
public:
    void f()
    {
        var = 1; // OK single var
    }
};
然而,我有这样一个场景:

template<typename DERIVED_CLASS>
class TemplatedBase0
{
protected:
    int var = 0;
};

class Base1 : public virtual TemplatedBase0<Base1>
{
};

class Base2 : public virtual TemplatedBase0<Base2>
{

};

class Derived :
    public Base1,
    public Base2
{
public:
    void f()
    {
        var = 1; // ERROR: var is ambigous
    }
};
模板
类TemplatedBase0
{
受保护的:
int-var=0;
};
Base1类:公共虚拟模板数据库0
{
};
Base2类:公共虚拟模板数据库0
{
};
派生类:
公共基地1,
公共基地2
{
公众:
void f()
{
var=1;//错误:var不明确
}
};
我知道在上面的例子中,模板基类是不一样的,也就是说,有两个完全未实现的基类,看起来虚拟继承不起作用

所以我的问题是,有没有办法让这一切顺利进行?我应该采取什么设计/方法


我需要有一个基类作为模板,它采用派生类类型。但是如何使菱形继承成为可能?

代码中没有菱形。您的
派生的
有两个不同的
var
s。根据您想要写的内容:

Base1::var = 1;
Base2::var = 1;
但如何使钻石继承成为可能


不清楚你为什么想要钻石。如果您的目标是在
派生的
中只有一个
var
,则需要不同的设计。

如果您只想有一个
int-var
派生的
中,需要将其移动到非模板基类:

class GenericTemplatedBase0
{
  protected:
    int var = 0;
};

template<typename DERIVED_CLASS>
class TemplatedBase0 : virtual public GenericTemplatedBase0
{
    // ...
};

class Base1 : public TemplatedBase0<Base1>
{
};

class Base2 : public TemplatedBase0<Base2>
{
};

class Derived : public Base1, public Base2
{
  public:
    void f()
    {
        var = 1;
    }
};
类GenericTemplatedBase0
{
受保护的:
int-var=0;
};
模板
类TemplatedBase0:virtual public GenericTemplatedBase0
{
// ...
};
类Base1:公共模板数据库0
{
};
Base2类:公共模板数据库0
{
};
派生类:public Base1、public Base2
{
公众:
void f()
{
var=1;
}
};

是的,这正是我需要和想要的,谢谢朋友!