template <class NodeType, class EdgeType>
class GenericNetworkClass {
typedef std::vector<EdgeType<NodeType>*> EdgesType;
typedef std::vector<NodeType<EdgeType>*> NodesType;
EdgesType EdgesList;
NodesType NodesList;
}
template <class NodeType>
class GenericEdgeClass {
std::vector<NodeType*> *Nodes;
GenericNodeClass(std::vector<NodeType<GenericEdgeClass>*> *NodesPtr);
}
template <class EdgeType>
class GenericNodeClass {
std::vector<EdgeType*> *Edges;
GenericNodeClass(std::vector<EdgeType<GenericNodeClass>*> *EdgesPtr);
}
简单来说我只想要一个NetworkClass
模板节点和模板边缘
EdgeList
NodesList
所有NodeType都派生自GenericNodeClass
,所有EdgeType都派生自GenericEdgeClass
。
显然我写的不起作用。这里有什么正确的方法?
我希望我很清楚我想要做什么。
谢谢!
答案 0 :(得分:1)
你可以使用前向声明来处理循环依赖,但是你的模板很奇怪:为什么你应该强制执行类层次结构,遇到所有类型的协方差问题,当你可以为边缘和节点设置用户定义的类时不受约束“有效载荷“?
template <typename EdgeData, typename NodeData> class Edge;
template <typename EdgeData, typename NodeData> class Node;
template <typename EdgeData, typename NodeData> class Edge{
std::vector<Node<EdgeData, NodeData>*> *Nodes;
EdgeData data;
public:
Edge(std::vector<Node<EdgeData, NodeData>*> *NodesPtr, EdgeData & data);
EdgeData getData();
void addNode(Node<EdgeData, NodeData> & node);
...
}
template <typename EdgeData, typename NodeData> class Node{
std::vector<Edge<EdgeData, NodeData>*> *Edges;
NodeData data;
public:
Node(std::vector<Edge<EdgeData, NodeData>*> *EdgesPtr, NodeData & data);
NodeData getData();
void addEdge(Edge<EdgeData, NodeData> & edge);
...
}
template <typename EdgeData, typename NodeData> class Hypergraph{
private:
std::vector<Edge<EdgeData, NodeData>*> edgesList;
std::vector<Node<EdgeData, NodeData>*> nodesList;
...
}
更好的是,利用对称性将Edge和Node简化为单个类:
template <typename OwnData, typename DualData> class Entity{
std::vector<Entity<DualData, OwnData>*> *duals;
OwnData data;
public:
Entity(std::vector<Entity<DualData, OwnData>*> *duals, OwnData & data);
OwnData getData();
void addDual(Entity<DualData, OwnData> & dual);
...
}
template <typename EdgeData, typename NodeData> class Hypergraph{
private:
std::vector<Entity<EdgeData, NodeData>*> edgesList;
std::vector<Entity<NodeData, EdgeData>*> nodesList;
...
}