This question already has answers here:
Defining static const integer members in class definition
(7个答案)
4年前关闭。
我有以下课程:
MessageConstants.h:
SystemMessage.h:
SystemMessage.cpp:
我在SystemMessage.cpp语句
在函数EvtError :: EvtError(int,std :: string)中:
未定义对MessageConstants :: ErrorDescriptionLength的引用
collect2:错误:ld返回1退出状态
make:[链接]错误1
如果将
我的问题:
为什么它不抱怨SystemMessage.h文件中的
如何避免以上链接错误?
它通过引用获取其输入-要求它们具有存储空间。您的常数:
当前没有存储空间。有两种方法可以解决此问题。首先,您可以仅在.cpp中添加存储:
其次,您可以将其转换为int:
(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