1

这是我的课:

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’

是什么导致了这个问题?

4

3 回答 3

3

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

template <class T>
class Graph;

template <class T>
class Vertex
{
private:
//...
public:
friend class Graph<T>;
// ... and so on
于 2012-07-16T04:40:40.147 回答
2

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

friend class Graph<T>;

代替

friend class Graph;
于 2012-07-16T04:40:39.730 回答
0

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

template <class T> friend class Graph;

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

于 2012-07-16T04:50:05.050 回答