C ++不会让我使用struct作为模板参数

时间:2011-09-28 14:52:55

标签: c++ templates struct

也许这是各种各样的标题问题......但这就是发生的事情:

编译器在行上给我一个错误:

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_ */

2 个答案:

答案 0 :(得分:11)

你有一个循环包含。 Queue.h包括EmailSystem.hEmailSystem.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互相包含。