我希望使用一个辅助类,它只会为给定的模板参数创建几个 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 的选项。相反,它修改层次结构,在 Base
和 Derived
之间插入 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/