在 C++ 中使用静态映射的奇怪问题

Weird issue using static map in c++

本文关键字:问题 映射 静态 C++      更新时间:2023-10-16

>我有一个问题,我不明白为什么会发生这种情况。简而言之,我想创建一个单例来读取配置文件,其中每个属性将存储在映射中。

我将配置类 (.h) 定义为

class Configuration {
public:
static Configuration* getInstance(std::string configFile);
private:
static std::map<std::string, std::string> properties;
static bool instanceFlag;
static Configuration *instance;
Configuration();
Configuration(std::string configFile);
~Configuration();
};

在实现类上,我有以下内容:

#include <iostream>
#include <fstream>
#include "Configuration.h"
std::map<std::string, std::string> Configuration::properties {};
bool Configuration::instanceFlag = false;
Configuration *Configuration::instance = NULL;

问题是,我的变量属性是配置的类型而不是映射。如果将键和值替换为 int,则属性将变为映射。这似乎很奇怪。

我在头文件中包含字符串。

没有异常或错误。我的意思是,编译运行良好而不是错误。但是,我的地图总是空的。在日食上调试它时,我注意到变量属性的类型是配置而不是映射。

当我将键和值类型从字符串更改为 int 时,对象属性的类型为 map。

你以前见过吗?我在这里错过了什么?

谢谢 毛罗

这似乎是一个 gdb 错误,而不是编译器或代码的问题。

在 gdb 上,我可以评估以下内容:

ptype Configuration::properties.instanceFlag

它返回type = bool. gdb 确实将您的properties解释为类型Configuration.

但是,如果将private:更改为public:并将行Configuration::properties.instanceFlag = true放在main()上,则g++会发出以下错误:

test.cpp: In function ‘int main()’:
test.cpp:26:28: error: ‘class std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >’ has no member named ‘instanceFlag’
Configuration::properties.instanceFlag = true;

意味着您的编译器理解得很好。在 ubuntu 下使用 g++-5.4.0 和 gdb-7.11.1 进行测试。

编辑自包含示例是:

#include <map>
#include <string>
struct Configuration {
static std::map<std::string, std::string> properties;
static bool instanceFlag;
};
std::map<std::string, std::string> Configuration::properties {};
bool Configuration::instanceFlag = false;
int main(void)
{
Configuration::properties.instanceFlag = true;
return 0;
}

假设文件名是mytest.cpp,如果使用g++ mytest.cpp -std=c++11编译它,它应该会发出以下错误。

mytest.cpp: In function ‘int main()’:
mytest.cpp:14:28: error: ‘class std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >’ has no member named ‘instanceFlag’
Configuration::properties.instanceFlag = true;

如果您看到上述错误,则表示您没事。这只是 gdb 的错误,您的代码使用静态映射不会有任何问题。

如果它没有错误,那就是一个问题。