也许这是各种各样的标题问题......但这就是发生的事情:
编译器在行上给我一个错误:
Queue<Email> mailbox;
这是错误:
..\EmailSystem.h:25: error: ISO C++ forbids declaration of `Queue' with no type
..\EmailSystem.h:25: error: expected `;' before '<' token
Queue.h:
#ifndef QUEUE_H_
#define QUEUE_H_
#include <string>
#include "EmailSystem.h"
...
template <class B>
class Queue {
...
};
#endif /* QUEUE_H_ */
Queue.cpp:
#include "Queue.h"
...
template class Queue<Email>;
EmailSystem.h:
#ifndef EMAILSYSTEM_H_
#define EMAILSYSTEM_H_
#include <iostream>
#include <string>
#include <vector>
#include "Queue.h"
struct Email {
...
};
struct User {
std::string name;
Queue<Email> mailbox;
};
...
#endif /* EMAILSYSTEM_H_ */
答案 0 :(得分:11)
你有一个循环包含。 Queue.h
包括EmailSystem.h
,EmailSystem.h
包含Queue.h
,因此包含警戒会确保标题在第二次被包含时无效。这意味着,如果Queue.h
是第一个被包含在内,那么Queue
在它首次用于EmailSystem.h
之前尚未被声明,此时包括:
Queue<Email> mailbox;
我猜,但我发现您的模板Queue
(如果它确实是通用类模板)不太可能需要知道Email
,所以您应该删除#include "EmailSystem.h"
来自Queue.h
来解决您的问题。
答案 1 :(得分:2)
#include "EmailSystem.h"
之前,您在Queue.h中class Queue
。因此,当编译器试图弄清楚如何创建struct User
时,它无法确定您尝试使用的Queue<Email>
是什么。
请注意,EmailSystem.h和Queue.h互相包含。