コメントで指摘したように、に含めたり、そのa.h
逆を行ったりしました。これにより、クロスインクルードとも呼ばれる循環的な依存関係が原因で、関数とクラスが「未定義」になるというエラーが発生します。test.h
あなたの場合、.cpp
ファイルに が含まれtest.h
ている場合、最初に関数が含まれa.h
てから定義されますanything();
が、これは明らかに望んでいるものa.h
ではありませんanything()
。
test.h
(before a.h
)を含むユニットをコンパイルすると、コードは次のように展開されa.h
ます。
/* INCLUDED FROM a.h */
class Fooness{
public:
Fooness(){
anything();
};
};
inline void anything() {
....
}
ご覧のとおり、anything()
いつ使用するかは定義されていません。ただし、コンパイル単位にa.h
(before test.h
) が含まれ、それ自体に が含まれtest.h
ている場合は、次のように展開されます。
/* INCLUDED FROM test.h */
inline void anything() {
....
}
class Fooness{
public:
Fooness(){
anything();
};
};
したがって、順序は正しいです。
両方の状況で機能させるには、含める前に前方宣言 できます。anything()
test.h
a.h
test.hの修正版:
#ifndef TEST_H
#define TEST_H
void anything(); // forward-declaration
#include "a.h" // <-- this is important to be *below* the forward-declaration
inline void anything() {
....
}
// more stuff
#endif
次に、test.h
(before a.h
) を含めると、次のように展開されます。
void anything();
/* INCLUDED FROM a.h */
class Fooness{
public:
Fooness(){
anything();
};
};
inline void anything() {
....
}