解决歧义访问的默认设置
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
来解决会更好。
考虑以下 类:
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
来解决会更好。