C++ typedef继承二义性问题

标签 c++ typedef ambiguous

我希望使用一个辅助类,它只会为给定的模板参数创建几个 Qt typedef 别名。 Ofc 模棱两可很快就出现了交叉,并且经常与我当前的项目设计情况发生冲突,因为有人希望访问 Base 以及 Derived。不确定这个问题是否能以某种方式解决,仍然试一试。示例:

template <class T> class SmartAlias
{
public:
    typedef QSharedPointer<T> Shared;
};

class Base : public SmartAlias<Base>
{
};

class Derived : public Base, public SmartAlias<Derived>
{
};

Base::Shared base;  // Normally works
Derived::Shared derived;  // ambiguous problem

有更好的解决方案吗?谢谢。

总结/更新/解决方案

总而言之,如果有人想使用它,请使用 Anton Savin 的想法,也可以使用虚拟继承将其扩展为多重继承:

#include <vector>

template <typename T, typename... MyBases> class SmartAlias :  virtual public MyBases... {
public:
    typedef std::vector<T> Shared;
};

class Base : public SmartAlias<Base>
{
};

class Derived : public SmartAlias<Derived, Base>
{
};

class MiniBase : public SmartAlias<MiniBase> {};

class MiniDerived : public SmartAlias<MiniDerived, MiniBase, Derived> { 
public: 
    MiniDerived() : MiniBase(), Derived() 
    {
    }
};

int main() {
    Base::Shared base;
    Derived::Shared derived; 
    MiniDerived::Shared md;
}

另一方面,我会坚持 Frerich Raabe 提到的我目前的解决方案。

最佳答案

您可以在 Derived 中明确指定要使用两个 Shared 中的哪一个:

class Derived : public Base, public SmartAlias<Derived>
{
public:
    using Shared = SmartAlias<Derived>::Shared;
    // or in pre-C++11
    typedef SmartAlias<Derived>::Shared Shared;
};

这是另一个不需要为所有类添加 typedef 的选项。相反,它修改层次结构,在 BaseDerived 之间插入 SmartAlias:

template <typename T, typename MyBase = void> class SmartAlias : public MyBase
{
public:
    typedef typename SmartAlias<T>::Shared Shared;
};

template <typename T> class SmartAlias<T, void> 
{
public:
    typedef QSharedPointer<T> Shared;
};

class Base : public SmartAlias<Base>
{
};

class Derived : public SmartAlias<Derived, Base>
{
};

关于C++ typedef继承二义性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26905456/

相关文章:

c - 包含的结构定义无法识别

c - typedef 何时成为实际类型?

c++ - 复杂继承情况下的模糊函数调用

c++ - C++ 中的 ThreadPool 库

c++ - 具有某些不会在逻辑上定义的属性的类的概念

c++ - 产生从负到正范围的随机 float ?

haskell - 我可以编译这个类型不明确的函数吗?

c++ - 语法错误'常量错误

c++ - Arduino 上的 typedef 结构 : variable does not name a type

string - 避免 Scala 中的隐式定义歧义