public:静态常量字符串声明/初始化问题

public: static constant string declaraion/initialization issue

本文关键字:初始化 问题 声明 字符串 静态 常量 public      更新时间:2023-10-16

我希望创建静态常量字符串变量协议列表,但我在这方面遇到了问题。

  • 构建系统:Visual Studios 2017
  • 开发/目标体系结构:x64
  • 开发/目标操作系统:Windows 10 Professional(64位(
  • 应用程序开发平台:Win32 API(Windows SDK 10.0.17134.0(

错误:

错误LNK2001未解析的外部符号"public:static classstd::basic_string<char,structstd::char_traits<char>,类std::分配器<char>>const协议::serviceVersionRequestStr"(?serviceVersionRequestStr@Protocol@@2V$basic_string@DU$char_traits@D@std@@V$allocator@D@2@@std@@B(

Protocol.h

class Protocol
{
public:
static const std::string        libraryVersionRequestStr;
static const std::string        serviceVersionRequestStr;
static const std::string        libraryVersionResponseStr;
static const std::string        serviceVersionResponseStr;
static const std::string        restartStr;
static const std::string        identifyUserStr;
static const std::string        registerUserStr;
static const std::string        deleteUserStr;
static const std::string        identifyUserSuccessStr;
static const std::string        identifyUserWithdrawStr;
static const std::string        identifyUserwithdrawSuccessStr;
static const std::string        identifyUserwithdrawFailureStr;
static const std::string        positiveAcknowledgementStr;
static const std::string        negativeAcknowledgementStr;
//Some Public and Private methods
}

Protocol.cpp

std::string libraryVersionRequestStr        = std::string("GetLibraryVersion");
std::string serviceVersionRequestStr        = std::string("GetServiceVersion");
std::string libraryVersionResponseStr       = std::string("LibraryVersion:");
std::string serviceVersionResponseStr       = std::string("ServiceVersion:");
std::string restartStr                      = std::string("RestartService");
std::string identifyUserStr                 = std::string("IndentifyUser");
std::string registerUserStr                 = std::string("RegisterUser");
std::string deleteUserStr                   = std::string("DeleteUser");
std::string identifyUserSuccessStr          = std::string("IdentifyUserSuccess:");
std::string identifyUserWithdrawStr         = std::string("IdentifyUserWithdraw");
std::string identifyUserwithdrawSuccessStr  = std::string("IdentifyUserWithdrawSuccess:");
std::string identifyUserwithdrawFailureStr  = std::string("IdentifyUserWithdrawFailure:");
std::string positiveAcknowledgementStr      = std::string("Ack_");
std::string negativeAcknowledgementStr      = std::string("Nack_");

如果我试图在定义期间初始化静态常量字符串,我会得到一个错误

例如:static const std::string negativeAcknowledgementStr = std::string("Nack_");

错误(活动(E1591类型为"const-std::string"的成员不能具有类内初始化程序

对于这个项目,由于我坚持C++17标准,我通过添加inline关键字并使用定义初始化我的变量来解决错误。

static inline const std::string     negativeAcknowledgementStr = std::string("Nack_");

问题:

  1. 这是C++17标准中引入的东西,还是Visual C++编译器强制要求的东西?我以前使用C++14在gcc中编写过代码,在那里我在头文件中用公共访问修饰符在类中定义了静态常量字符串变量,并在单独的源文件中初始化了它们
  2. 除内联关键字外,我还有哪些其他方法可以实现相同的效果

您在定义中遗漏了类名和const关键字

const std::string Protocol::libraryVersionRequestStr = std::string("GetLibraryVersion");

等等。等