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
- Edge 可以通过指针从网络访问
NodesList
所有 NodeType 都派生自 GenericNodeClass
,所有 EdgeType 派生自 GenericEdgeClass
。
显然我写的是行不通的。这里的正确方法是什么?
我希望很清楚我要做什么。
谢谢!
最佳答案
你可以用前向声明处理循环依赖,但你的模板很奇怪:当你可以让边和节点的用户定义类不受约束时,你为什么要强制类层次结构,遇到所有类型的协方差问题“有效载荷”?
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;
...
}
关于c++ - TemplateClasses 相互依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20515797/