コメントで指摘したように、に含めたり、その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.ha.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() {
....
}