在C ++中实现图形类

时间:2012-07-16 04:29:13

标签: c++ graph-theory

这是我的班级:

template <class T>
class Vertex
{
private:
  T data;
  Vertex<T>* next;
public:
  friend class Graph;
  Vertex(T dat, Vertex<T>* nex)
  {   
    data=dat;  next = nex;
  }
};

template <class T>
class Graph
{
public:
  Vertex<T>* head;
  Graph() : head(NULL)
  {
  }

  void insert(T data)
  {
    Vertex<T>* ptr = new Vertex<T>(data, head);
    head = ptr;
  }
};

主要:

int main()
{
  Graph<int> graph;
  graph.insert(1);
}

编译时告诉我:

graph.h: In instantiation of ‘Vertex<int>’:
graph.h:30:   instantiated from ‘void Graph<T>::insert(T) [with T = int]’
main.cpp:6:   instantiated from here
graph.h:10: error: template argument required for ‘struct Graph’

是什么导致了这个问题?

3 个答案:

答案 0 :(得分:3)

在朋友声明中使用时,您必须“转发声明”Graph类:

template <class T>
class Graph;

template <class T>
class Vertex
{
private:
//...
public:
friend class Graph<T>;
// ... and so on

答案 1 :(得分:2)

正如错误消息所示,无论您在何处使用它,都需要为Graph类提供模板参数。所以,朋友类声明应该有

friend class Graph<T>;

而不是

friend class Graph;

答案 2 :(得分:0)

事实上,没有必要进行前瞻性声明。如果尚未定义类或函数,则friend声明会创建前向声明。标准明确说明了这一点。你应该写:

template <class T> friend class Graph;

这将有效地将Graph的所有实例化声明为当前类的朋友。