智能感知警告:不允许使用不完整类型(在内联方法中,但类型的定义在cpp中)

时间:2012-04-22 14:34:34

标签: c++

我已经向前声明了我的枚举类,定义是在cpp中,程序编译但是我在类型名称下面得到一个红色的“wave”(在内联方法下面)

我想问一下是否建议将内联方法移动到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文件中吗?为什么?

1 个答案:

答案 0 :(得分:2)

如果必须将class方法(或任何函数)放入一个头文件中,该文件将被几个.cpp文件包含,那么它必须是inline。< / p>

inline并不一定意味着通常的宏样式内联。宏样式内联由编译器决定,程序员对它没有多少控制权 此inline关键字是保证的效果,其中只为所有.cpp文件生成一个定义。有效地,inline 关键字维护ODR

AFAIK,通常当在类中声明它时,必须使inline(用于ODR目的)方法。所以一旦你在类中创建方法inline,一切都应该正常工作,没有错误/警告。稍后将inline关键字放在类外的方法定义是多余的。