用C++实现一个图类

Implementing a graph class in C++

本文关键字:一个 C++ 实现      更新时间:2023-10-16

这是我的类:

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’

是什么导致了这个问题?

在友元语句中使用Graph类时,必须"前向声明":

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

正如错误消息所说,无论在哪里使用Graph类,都需要为它提供模板参数

friend class Graph<T>;

代替

friend class Graph;

实际上,不需要正向声明。如果类或函数尚未定义,则友元声明将创建正向声明。标准明确说明了这一点。你应该写:

template <class T> friend class Graph;

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