2

列挙型クラスを前方宣言しました。定義は cpp にあり、プログラムはコンパイルされますが、型名の下に赤い「波」が表示されます (以下のインライン メソッド)。

そのインライン化されたメソッドを cpp ファイルに移動することをお勧めしますか? 私は趣味のプログラマーなので、ヘッダー ファイルに不完全な型を持つこのインライン メソッドが問題ないかどうかはわかりません。

ヘッダファイル:

#include <map>

using std::map;
enum class MinimumName;

    class Limits
    {
    public:
        Limits(TableLayout layout);
        void SetMinimum(MinimumName name, unsigned int minimum);

// other stuff irrelevant

    private:
        typedef map<MinimumName, unsigned int> MinContainer;
MinContainer::iterator Miniter;
        MinContainer Minimums;
};
                                   //intelisence warning here in argument list
inline void Limits::SetMinimum(MinimumName name, unsigned int minimum)
{                             // incomplete type is not allowed
    Miniter = Minimums.find(name);
    Miniter->second = minimum;
}

cpp ファイル

enum class MinimumName
{
    Inside,
    Outside,
    Table
};

それをcppファイルに移動しますか?なぜ?

4

1 に答える 1

2

class複数の .cpp ファイルによってインクルードされる予定のヘッダー ファイルにメソッド (または任意の関数) を配置する必要がある場合は、.cpp ファイルにする必要がありますinline

これinlineは必ずしも通常のマクロ スタイルのインライン展開を意味するわけではありません。マクロ スタイルのインライン展開はコンパイラによって決定され、プログラマはそれをあまり制御できません。
このinlineキーワードは、すべての .cpp ファイルに対して 1 つの定義のみが生成される保証された効果です。事実上、inline キーワードはODRを維持します。

私の知る限り、従来は、メソッドがinlineクラス内で宣言されているときに (ODR の目的で) メソッドを作成する必要がありました。したがって、クラス内でメソッドを作成すると、inlineエラー/警告なしですべてが正常に機能するはずです。後でinlineメソッド定義のキーワードをクラスの外に置くことは冗長です。

于 2012-11-23T04:00:42.887 に答える