【发布时间】:2011-06-08 18:50:30
【问题描述】:
我有这个文件 logger.hpp:
#ifndef _LOGGER_HPP_
#define _LOGGER_HPP_
#include "event.hpp"
// Class definitions
class Logger {
public:
/*!
* Constructor
*/
Logger();
/*!
* Destructor
*/
~Logger();
/*!
* My operator
*/
Logger& operator<<(const Event& e);
private:
...
};
#endif
还有这个文件 event.hpp
#ifndef _EVENT_HPP_
#define _EVENT_HPP_
#include <string>
#include "logger.hpp"
// Class definitions
class Event {
public:
/*!
* Constructor
*/
Event();
/*!
* Destructor
*/
~Event();
/* Friendship */
friend Logger& Logger::operator<<(const Event& e);
};
#endif
嗯。在 logger.hpp 我包括 event.hpp 在 event.hpp 我包括 logger.hpp。
我需要包含 event.hpp,因为在 logger.hpp 中我需要定义运算符。
我需要包含 logger.hpp,因为在 event.hpp 中,友谊要在 Event 类中定义。
这当然是一个循环递归。
我试过了:
1) 在 logger.hpp 中:
#ifndef _LOGGER_HPP_
#define _LOGGER_HPP_
#include "event.hpp"
class Event; // Forward decl
// Class definitions
...
不起作用。编译器告诉我,在 event.hpp 中有一个未被识别的类型,称为 Logger(他当然是对的):
ISO C++ 禁止声明 没有类型的“记录器”
编译器向我指出存在友谊声明的行(在 event.hpp 中)。
2) 在 event.hpp 中:
#ifndef _EVENT_HPP_
#define _EVENT_HPP_
#include <string>
#include "logger.hpp"
class Logger; // Forward decl
// Class definitions
...
不起作用。编译器告诉我,在 logger.hpp 中有一个未被识别的类型,称为 Event(同样,出于显而易见的原因,它是正确的):
ISO C++ 禁止声明“事件” 没有类型
编译器向我指出存在运算符声明的行(在 logger.hpp 中)。
嗯……不知道怎么面对这个?我尝试了一切,我到处提出声明,但是,当然,它们没有任何帮助。 这个怎么解决??? (我想最好的做法是存在的,我希望这样更好:))。
谢谢。
【问题讨论】:
-
您的标头保护标识符不能使用,请更改它们。 stackoverflow.com/questions/228783/…
标签: c++ include header-files include-guards cyclic-reference