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 に答える