2013-11-24 3 views
0

Я определил два файла заголовка.Объявление 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?

+3

Вы в основном спрашиваете: «Почему это скомпилировано, когда я использую стандартный контейнер C++ с неполным типом?». Здесь стандартный контейнер, который вы используете, это 'std :: queue', а' Token' - неполный тип. [Стандарт C++ * технически не позволяет этого] (http://stackoverflow.com/questions/18672135/why-c-containers-dont-allow-incomplete-types), но это может случиться, потому что внутренняя контейнер * реализация * не требуется полный тип. Это может быть или не быть правдой с другими компиляторами C++. –

+0

Вы правы. Первый компилятор, который я использую, - gcc. Компилятор microsoft указал на эту ошибку. Большое спасибо. @ В silico – stamaimer

ответ

-2

Когда вы включаете global.h в token.h, у компилятора есть полная информация для работы. Попытайтесь включить global.h в другой файл и у вас есть компиляция :-)

+2

Это не тот случай. Определение «Токен» предоставляется * после * использования. У компилятора нет полного определения для «токена» к тому времени, когда создается std :: queue empty'. –

Смежные вопросы