【发布时间】:2012-08-02 18:02:03
【问题描述】:
您好,我正在编写一个显示/显示和基准测试不同图表的程序。一个图由节点和边组成......所以我的问题是我有两个模板类(模板),它们是所有派生类的基础
template <class Node>
class Edge
{
public:
Edge() : startN(0), endN(0), price(0) {}
Edge(Node *startN, Node *endN, int price) : startN(startN), endN(endN), price(price)
{
startN->toEdges.push_back(this); // PROBLEM HERE
endN->fromEdges.push_back(this); // PROBLEM HERE
}
Node *startNode() const {
return startN;
}
Node *endNode() const {
return static_cast<Node *>(endN);
}
int getPrice() const {
return price;
}
void setPrice(int price) {
this->price = price;
}
private:
Node *startN;
Node *endN;
int price;
};
template<template<class> class EdgeTemplate >
class NodeBase
{
public:
NodeBase() : nodeId(0), key(0), state(UNLABELED), prev(0) {}
NodeBase(int id, int key) : nodeId(id), key(key), state(UNLABELED), prev(0) {}
void addToEdges(EdgeTemplate<NodeBase> *edge) {
toEdges.push_back(static_cast<EdgeTemplate<NodeBase> *>(edge));
}
int nodeId;
int key;
State state;
NodeBase *prev; // prevous scanned
QVector<EdgeTemplate<NodeBase> *> fromEdges; // start
QVector<EdgeTemplate<NodeBase> *> toEdges; // end
};
在另一个模板类中发生错误:
template <template<class> class EdgeTemplate, class Node>
class DijkstraAlgorithm {
...
QVector<EdgeTemplate<Node> *> Edges; // the problem for derived classes
...
};
叮当声:
error: cannot initialize a parameter of type 'Edge<NodeBase<Edge> > *' with an rvalue of type 'Edge<DNode> *'
startN->addToEdges(this);
^~~~
海合会:
error: no matching function for call to 'QVector<Edge<NodeBase<Edge> >*>::push_back(Edge<DNode>* const)'
据我了解,问题是派生类DNode (class DNode : public NodeBase <Edge>) 不能存储在基本类型NodeBase<Edge> 的硬币容器中...我试过转换它,但它没有工作。
谁能解释一下我做错了什么以及如何解决这个问题?
【问题讨论】:
标签: c++ qt templates gcc clang