Я определил два файла заголовка.Объявление foward в C++
global.h
#ifndef GLOBAL_H
#define GLOBAL_H
#include <queue>
#include <string>
//#include "token.h"
class Token;
typedef std::string TokenValue;
enum TokenType{//...};
inline void clear(std::queue<Token> tokens)
{
std::queue<Token> empty;
std::swap(tokens, empty);
}
#endif // GLOBAL_H
и token.h
#ifndef TOKEN_H
#define TOKEN_H
#include "global.h"
class Token
{
public:
Token (TokenType token_type, TokenValue token_value)
{
token_type_ = token_type;
token_value_ = token_value;
}
~Token(){}
//...
private:
TokenType token_type_;
TokenValue token_value_;
};
Я использую Foward заявление в global.h, но я не использую ссылку или указатель класса токена. Я использую std::queue<Token> empty;
в global.h. Я думаю, что это утверждение должно иметь размер Token. Я не могу понять, почему он может собрать успех. Это проблема queue
?
Вы в основном спрашиваете: «Почему это скомпилировано, когда я использую стандартный контейнер C++ с неполным типом?». Здесь стандартный контейнер, который вы используете, это 'std :: queue', а' Token' - неполный тип. [Стандарт C++ * технически не позволяет этого] (http://stackoverflow.com/questions/18672135/why-c-containers-dont-allow-incomplete-types), но это может случиться, потому что внутренняя контейнер * реализация * не требуется полный тип. Это может быть или не быть правдой с другими компиляторами C++. –
Вы правы. Первый компилятор, который я использую, - gcc. Компилятор microsoft указал на эту ошибку. Большое спасибо. @ В silico – stamaimer