【发布时间】:2013-12-08 23:59:01
【问题描述】:
我定义了两个头文件。
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 中使用了 foward 声明,但我没有使用 Token 类的引用或指针。我在 global.h 中使用std::queue<Token> empty;。我觉得这个语句一定需要Token的大小。我不明白为什么它可以编译成功。是queue的问题?
【问题讨论】:
-
您基本上是在问“为什么当我使用具有不完整类型的 C++ 标准容器时它会编译?”。在这里,您使用的标准容器是
std::queue,而Token是不完整类型。 The C++ standard technically does not allow this,但它可能只是碰巧起作用,因为内部容器 implementation 不需要完整的类型。对于其他 C++ 编译器来说,这可能是真的,也可能不是。 -
你是对的。我使用的第一个编译器是 gcc。微软的编译器指出了这个错误。非常感谢。@In silico
标签: c++