次の例を考えてみましょう。これは2つのヘッダーファイルで構成され、2つの異なる名前空間を宣言します。
// a1.h
#pragma once
#include "a2.h"
namespace a1
{
const int x = 10;
typedef a2::C B;
}
2つ目は
// a2.h
#pragma once
#include "a1.h"
namespace a2 {
class C {
public:
int say() {
return a1::x;
}
};
}
そして、単一のソースファイルmain.cpp
:
#include <iostream>
#include "a1.h"
#include "a2.h"
int main()
{
a2::C c;
std::cout << c.say() << std::endl;
}
このようにコンパイルされません(GCCとMSVCを試しました)。エラーは、a1
名前空間が宣言されていないことです(WindowsではC2653)。この方法でインクルード順序を変更した場合main.cpp
:
#include "a2.h"
#include "a1.h"
対称的なエラーメッセージが表示されます。つまり、a2
名前空間が宣言されていません。
どうしたの?