私はこのファイル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を含めます。
logger.hppで演算子を定義する必要があるため、event.hppを含める必要があります。
event.hppには、クラスEventで定義される友情があるため、logger.hppを含める必要があります。
もちろん、これは周期的な再帰です。
私はこれを試しました:
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内)を示します。
さて...これに直面する方法がわかりませんか?私はすべてを試し、どこにでも宣言を出しましたが、もちろん、それらは何の助けにもなりません。これを解決する方法??? (ベストプラクティスが存在すると思いますが、そう願っています:))。
ありがとうございました。