This question already has answers here:
Defining static const integer members in class definition
                                
                                    (7个答案)
                                
                        
                                4年前关闭。
            
                    
我有以下课程:

MessageConstants.h:

class MessageConstants
{

public:
    ...
    static const int ErrorDescriptionLength = 256;
...
};


SystemMessage.h:

class EvtError
{
private:
    struct MsgData
    {
        int errorCode;
        char errorDescription[MessageConstants::ErrorDescriptionLength];
    }__attribute__((packed)) msgData;

public:
    EvtError(int errorCode, string errorDescription);
    inline void setErrorDescription(string desc){memcpy(msgData.errorDescription, desc.c_str(),
                min(MessageConstants::ErrorDescriptionLength, (int)desc.length()));}

};


SystemMessage.cpp:

EvtError::EvtError(int errorCode, string errorDesc)
{
    memset(&msgData, '\0', sizeof(msgData));
    msgData.errorCode = errorCode;
    memcpy(msgData.errorDescription, errorDesc.c_str(), min(MessageConstants::ErrorDescriptionLength, (int)errorDesc.length()));
}


我在SystemMessage.cpp语句memcpy(msgData.errorDescription, errorDesc.c_str(), min(MessageConstants::ErrorDescriptionLength, (int)errorDesc.length()));上收到以下链接错误:

在函数EvtError :: EvtError(int,std :: string)中:
未定义对MessageConstants :: ErrorDescriptionLength的引用
collect2:错误:ld返回1退出状态
make:[链接]错误1

如果将MessageConstants::ErrorDescriptionLength替换为sizeof(msgData.errorDescription),链接错误将消失。

我的问题:


为什么它不抱怨SystemMessage.h文件中的MessageConstants::ErrorDescriptionLength,它在两个地方都有?
如何避免以上链接错误?

最佳答案

min的签名为:

template <typename T>
const T& min(const T&, const T&);


它通过引用获取其输入-要求它们具有存储空间。您的常数:

static const int ErrorDescriptionLength = 256;


当前没有存储空间。有两种方法可以解决此问题。首先,您可以仅在.cpp中添加存储:

const int MessageConstants::ErrorDescriptionLength;


其次,您可以将其转换为int:

min((int)MessageConstants::ErrorDescriptionLength, (int)errorDesc.length())
 // ^^^^^

关于c++ - 为什么它在cpp文件中提示而不在头文件中提示? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28132706/

10-10 15:57