【问题标题】:foward declaration in C++ [duplicate]C ++中的前向声明[重复]
【发布时间】: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&lt;Token&gt; empty;。我觉得这个语句一定需要Token的大小。我不明白为什么它可以编译成功。是queue的问题?

【问题讨论】:

  • 您基本上是在问“为什么当我使用具有不完整类型的 C++ 标准容器时它会编译?”。在这里,您使用的标准容器是std::queue,而Token 是不完整类型。 The C++ standard technically does not allow this,但它可能只是碰巧起作用,因为内部容器 implementation 不需要完整的类型。对于其他 C++ 编译器来说,这可能是真的,也可能不是。
  • 你是对的。我使用的第一个编译器是 gcc。微软的编译器指出了这个错误。非常感谢。@In silico

标签: c++


【解决方案1】:

当您在token.h 中包含global.h 时,编译器就有完整的信息可以工作。尝试将global.h 包含在另一个文件中,您将遇到编译错误:-)

【讨论】:

  • 事实并非如此。 Token 的定义是在 使用后提供的。到 std::queue&lt;Token&gt; empty 实例化时,编译器还没有完整的 Token 定义。
猜你喜欢
  • 2011-08-29
  • 2012-03-14
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
相关资源
最近更新 更多