2012-04-22 11 views
1

私はenumクラスを宣言しています、定義はcppであり、プログラムはコンパイルしますが、型名(以下インラインメソッド)Intellisense警告:不完全な型は許可されていません(インラインメソッドでは、型の定義はcppにあります)

インラインメソッドをcppファイルに移動することをお勧めしますか? 私はhobyプログラマーですので、ヘッダーファイルに不完全な型のインラインメソッドがあるかどうかわかりません。

ヘッダファイル:

#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のファイルにそれを移動したりしてはなりませんか?なぜ?

+0

Intellisenseの警告は、私の意見では無関係です。彼らは*非常に頻繁に間違っています。コンパイラは何を言いますか? – Nawaz

+0

私のコードは完全に正しいことを意味しますか?コンパイラは何も言わない。 – codekiddy

+0

私はそれを完全に見たことがありません。私が言ったように、なぜあなたのコンパイラは言う? – Nawaz

答えて

2

classの方法(またはその機能に関しては、何らかの関数)をいくつかの.cppファイルにインクルードするヘッダーファイルに入れる必要がある場合は、inlineにする必要があります。

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

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

関連する問題