这是我的班级:
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’
是什么导致了这个问题?
答案 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
的所有实例化声明为当前类的朋友。