0

私は2つのヘッダーを持っています。

// header1.h
class A
{
public:
    void f();
};

// header2.h
#include "header1.h"
inline void A::f()
{
    std::cout << "Yahoo.";
}

// test1.cpp
#include "header1.h"
int main() { A a; a.f(); return 0; }

// test2.cpp
#include "header2.h"
void ff() { /* do nothing */ }

MSVC 2013 でリンク エラーが発生しました。翻訳単位が 1 つしかないので、「ODR」が原因ではないのでしょうか?

これで、header2.h をインクルードする test2.cpp ができました。したがって、リンカは現在 header2.h を見つけることができると思います。それでもリンク エラーが発生するのはなぜですか?

4

2 に答える 2

3

それはインライン関数で行う方法ではありません。ファイルでは、コンパイラは関数がマークされているtest.cppことをどのように認識しますか?A::finline

インライン メンバー関数が必要な場合は、同じヘッダー ファイルで定義するか、定義されているヘッダー ファイルをインクルードする必要があります。

したがって、解決策 1:#include "header2.h"の代わりに"header1.h".

解決策 2: クラス内でインラインで関数を定義します。

class A
{
public:
    void f() { ... }
};

解決策 3: クラスの後に同じヘッダー ファイル内で関数を定義します。

class A { ... };

inline void A::f() { ... }
于 2014-07-24T15:40:42.550 に答える
0

どこを探すべきかをコンパイラに伝えたことがないため、コンパイラはどこを見つけるべきかを知りませんA::f()#include "header2.h"test.cpp で行う必要があります。それか、または A::f() の定義を に移動しheader1.hます。

于 2014-07-24T15:41:16.407 に答える