让我们考虑一下我在其中创建的代码 Typedef
类自动继承别名。
#include <memory>
template <typename T>
struct Typedef
{
typedef std::unique_ptr<T> Ptr;
typedef std::unique_ptr<const T> ConstPtr;
};
struct X : public Typedef<X> { Ptr Func(); }; // no problem, Ptr = std::unique_ptr<X>
struct Y : public Typedef<Y> { Ptr Func(); }; // no problem, Ptr = std::unique_ptr<Y>
struct A : public X, public Typedef<A>
{
using Typedef<A>::Ptr; // (A), better than typedef typename Typedef<A>::Ptr Ptr, am I right?
Ptr Func();
};
struct B : public X, public Y, public Typedef<B>
{
using Typedef<B>::Ptr; // (B)
Ptr Func();
};
通常这没有问题,但是当我从多个类继承时,我必须消除多个继承别名之间的歧义。
是否有任何更简单的消除歧义的方法?(可能具有 C++14/17 特性)
如果没有,有没有更简单的方法自动为每个类创建别名?我不想
typedef std::unique_ptr<Foo> Ptr
在每个类定义中。 我想要Foo::Ptr
,Foo::ConstPtr
在每个类(class)公开可见。最新的 Eclipse Oxygen 解析器坏了吗?它通常能正确理解代码(包括 A),但突出显示 (B) 时有错误:“typedef is ambiguous”。在这种情况下,原因似乎是多重继承。 GCC 没有问题,编译没有任何警告。
如果我的
Typedef
类声明了更多别名,我有冲突 - 有没有比using Typedef<Foo>::Ptr
更简单的方法来解决所有冲突? ,...::ConstPtr
都是吗?
最佳答案
如果你真的坚持那种行为,一种可能是添加额外的类......
struct XBase { ... };
struct YBase { ... };
struct X : public XBase, public Typedef<X> { ... };
struct Y : public YBase, public Typedef<Y> { ... };
struct ABase { ... };
struct BBase { ... };
struct A :
public ABase,
public XBase,
public Typedef<A> { ... };
struct B :
public BBase,
public XBase,
public YBase,
public Typedef<B> { ... };
这样,每个类都有一种简单的方法来提供自己的别名,即使是多重继承也是如此。
但是,正如我在评论中所解释的那样,我通常不建议采用这种方法。
应避免多重(公共(public))继承,因为它会产生强耦合。通常最好改用组合。接口(interface)类是一个异常(exception)(只有纯虚函数,如果您打算能够从其接口(interface)指针销毁对象,则可能是虚析构函数)。混合可能是多重继承可能有用的另一种情况,但在这种情况下,您将使用私有(private)继承,即使这样组合也可能更可取。耦合越少,如果您想进行重大更改,系统维护起来就越容易。
此外,正如我在评论中所解释的那样,自 std::unique_ptr<>
以来定义此类 typedef 可能不是一个好主意。具有与之关联的行为,出于文档目的,您编写 std::unique_ptr<A> Func();
可能会更好反正。它使应该如何使用该功能更加明显。
关于c++ - 如何正确消除继承的 typedef 的歧义?以及如何缓解他们的创作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45389141/