我有一组基本图形类,它们使用CRTP
来处理派生图形类。我有一个模板类GraphTypes
,它将派生的图类作为模板参数,然后基本图类,如Edge
和Node
,将GraphTypes
作为模板参数。
在基类graph
中,我使用类型别名(using
)来简化派生类的使用。我希望这些类型别名只在基本图形类中可见,而在派生图形类中不可见。这可能吗?
请参阅下面的代码,了解设置,以及在派生类中使用基图类中的类型别名的问题。
namespace DirectedGraph
{
template<class NodeT, class EdgeT>
class GraphTypes
{
public:
using NodeType = NodeT;
using EdgeType = EdgeT;
};
template<class GraphTypes>
class Edge
{
private:
using NodeType = typename GraphTypes::NodeType;
using EdgeType = typename GraphTypes::EdgeType;
public:
auto This() -> EdgeType&;
};
}
namespace MyGraph
{
class Node;
class Edge;
using GraphTypes = DirectedGraph::GraphTypes<Node, Edge>;
enum class EdgeType { A, B, C };
class Edge : public DirectedGraph::Edge<GraphTypes>
{
Edge(EdgeType Type); // `EdgeType` is interpreted as the type alias `DirectedGraph::Edge::EdgeType` instead of the enum `MyGraph::EdgeType`.
};
}
2条答案
按热度按时间o75abkj41#
您始终可以限定完整的命名空间
或者为类型/类型别名使用不同的名称以避免混淆。
也就是说,如果您坚持保持名称不变,并且不想从基类中使用它们,请通过类/结构提供对这些别名类型的间接访问。
Demo
rm5edbpk2#
我假设你不想在
Edge
中重命名EdgeType
。如果你愿意这样做,你可以使用不同的别名不同的名字,而不会遇到这个问题。为了解决这个问题而不更改任何名称,您可以通过在
MyGraph::Edge
中声明另一个别名来隐藏DirectedGraph::Edge<T>::EdgeType
:MyGraph::Edge::EdgeType
别名将遮蔽基类作用域和周围作用域中的所有声明,因此您可以像这样消除歧义。