C ++ не позволит мне использовать структуру в качестве аргумента шаблона - PullRequest
4 голосов
/ 28 сентября 2011

Возможно, это проблема с заголовками ... Но вот что происходит:

Компилятор выдает мне сообщение об ошибке:

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 ]

11 голосов
/ 28 сентября 2011

У вас есть циркулярное включение.Queue.h включает в себя EmailSystem.h и EmailSystem.h включает Queue.h, поэтому защитные элементы включают в себя, что заголовок не влияет на второй раз, когда он включается.Это означает, что если Queue.h будет первым, которое будет включено, то Queue еще не будет объявлено до того, как оно будет впервые использовано в EmailSystem.h, которое оно включает, на данный момент:

Queue<Email> mailbox;

I'mдогадываюсь, но я считаю маловероятным, что ваш шаблон Queue (если это действительно шаблон общего класса) должен знать о Email, поэтому вам, вероятно, следует удалить #include "EmailSystem.h" из Queue.h, чтобы решить вашу проблему.

2 голосов
/ 28 сентября 2011

Вы #include "EmailSystem.h" в Queue.h, прежде чем объявить class Queue.Поэтому, когда компилятор пытается выяснить, как создать struct User, он понятия не имеет, что Queue<Email> вы пытаетесь использовать.

Обратите внимание, что EmailSystem.h и Queue.h включают друг друга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...