1

私は MSVC の使用を休止しており、クラス メンバー関数のインライン化に問題がなかったことを漠然と覚えています。ただし、 inline キーワードをそのまま使用すると、次のようになります。

//In header file
class A {
    public:
        inline void funcA(void);
};

//In cpp file
void A::funcA(void) {

}

LNK2019、未解決のシンボルが表示されます (関数がエラーが示すものと正確に一致しているにもかかわらず、欠落しています)。ヘッダーと定義の両方をインラインとしてマークしようとしましたが、同じことが起こります。ビルドを試みた後に inline キーワードも削除しましたが、ソリューションをクリーンアップするまでエラーが残り、その後、すべてが正常に sans-inline でビルドされます。私が問題をグーグルで調べたとき、誰も同じ問題を抱えていないようで、明らかなことを見逃していることを示唆しています...しかし、それは何ですか?

4

2 に答える 2

3

インライン関数は、常にヘッダーで定義する必要があります。クラス定義内にある必要はありませんが、ヘッダーにある必要があります。ヘッダーに入れないと、.h ファイルを含む他のモジュールが定義を参照してインライン化できなくなります....

参考までに、最近のバージョンの Visual C++ にはリンク時コード生成機能があり、インライン化される関数が他の .cpp ファイルで定義されていても、コンパイラは他のモジュール (= cpp ファイル) で関数をインライン化できます。inlineただし、これは独自の拡張機能であり、キーワードに関係なく行われます。移植可能な方法は、使用inlineしてヘッダーに入れることです。

于 2013-10-27T20:53:03.387 に答える
1

インライン メンバーを public または protected にしたらすぐに、定義をヘッダーに入れる必要があります。免除は、ソースで使用されている場合のみ、プライベート インライン (フレンド アクセスなし) です。(プリコンパイル済みヘッダーを修正するには、クリーンが必要になる場合があります)

于 2013-10-27T21:08:37.417 に答える