解决歧义访问的默认设置

Default for resolving ambiguous access

考虑以下 类:

class VisitableNode {
public:
    virtual void Visit();
};

class VisitableGraph {
public:
    virtual void Visit();
};

class OtherNode {
};

class OtherGraph {
};

template<class G, class N>
class GraphNode : public G, public N {
};

class MyVisitableGraph : public GraphNode<VisitableGraph, VisitableNode> {
};

class MyOtherGraph : public GraphNode<OtherGraph, OtherNode> {
};

MyVisitableGraph visitableGraph;
visitableGraph.Visit(); // Ambiguous access. Could be either VisitableGraph::Visit or VisitableNode::Visit.

MyOtherGraph otherGraph;

可以通过using inside MyVisitableGraph:

解决访问不明确的问题
class MyVisitableGraph : public GraphNode<VisitableGraph, VisitableNode> {
    using VisitableGraph::Visit;
};

但是,有没有办法解决 GraphNode 中的歧义?我不能只做 using G:Visit,因为那样 MyOtherGraph 将无法编译。例如,是否可以指定默认情况下 G 的优先级高于 N 以解决 GraphNode 中的歧义?

按照@463035818_is_not_a_number的建议,这个给出了一个解决方案:

template<class G, class N>
class GraphNode : public G, public N {
public:
    template<class = decltype(&G::Visit)>
    void Visit() {
        G::Visit();
    }
};

它失去了 virtual 说明符,因此它可能并不总是可用。而且它非常 hacky,所以我不认为我会使用它。如果说所有歧义都应该通过使用 G 而不是 N 来解决会更好。