2013-11-24 122 views
0

我定義了兩個頭文件。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_; 
}; 

我用盼着申報global.h,但我不使用類令牌的引用或指針。我在global.h中使用std::queue<Token> empty;。我認爲這個聲明必須要有令牌的大小。我無法弄清楚爲什麼它能編譯成功。這是queue的問題?

+3

您基本上問「爲什麼編譯時使用C++標準容器與不完整的類型?」。在這裏,你使用的標準容器是'std :: queue','Token'是不完整的類型。 [C++ *標準*技術上不允許這樣](http://stackoverflow.com/questions/18672135/why-c-containers-dont-allow-incomplete-types),但它可能恰好工作,因爲內部容器*實現*不需要完整的類型。其他C++編譯器可能會也可能不會。 –

+0

你說得對。我使用的第一個編譯器是gcc。微軟的編譯器指出這個錯誤。感謝很多。@在計算機上 – stamaimer

回答

-2

當您在token.h中包含global.h時,編譯器具有完整的信息。嘗試在另一個文件中包含global.h,並且您將發生編譯錯誤:-)

+2

事實並非如此。 'Token'的定義在*使用後提供*。在'std :: queue empty'被實例化時,編譯器沒有'Token'的完整定義。 –