2

これは私に頭を悩ませています。

ヘッダー test.h に次のものがあります。

inline void anything(){
std::cout<<" anything "<<ii;
}

次に、test.h を含む ah があります。

class Fooness{
public: 
Fooness(){
    anything(); //compiler reports "use of undeclared identifier"
    };
};

ただし、単に関数定義を a.cpp に移動すると、次のようになります。

Fooness::Fooness(){
anything();
}

できます。a.cpp には、ah を含む test.h が含まれていanything()ます。

4

2 に答える 2

2

コメントで指摘したように、に含めたり、その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() {
    ....
}
于 2013-01-21T03:32:40.393 に答える
1

「宣言されていない識別子」が約anything()iiあることを確認してくださいoperator<<...

于 2013-01-21T03:32:31.230 に答える