在 C++ 中使用静态映射的奇怪问题
Weird issue using static map in c++
>我有一个问题,我不明白为什么会发生这种情况。简而言之,我想创建一个单例来读取配置文件,其中每个属性将存储在映射中。
我将配置类 (.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 的错误,您的代码使用静态映射不会有任何问题。
如果它没有错误,那就是一个问题。
相关文章:
- AIX C++映射编译问题
- 在c++中擦除后在映射上迭代时出现的奇怪问题
- 在 C++ 中使用静态映射的奇怪问题
- 一维数组映射方式的性能差异问题
- QlineEdit的信号映射问题
- 使用集合和映射来解决模式问题
- 在将平截头体从摄影机空间转换为灯光空间以进行阴影映射方面存在主要问题
- 使用成员函数指针作为键C++映射时出现问题
- 无序映射的问题
- 我的 lambda 表达式进行映射键比较有什么问题?
- 将 std 绑定传递到函数映射的问题
- 打开文件映射问题,找不到文件映射
- 标准::映射插入/擦除的并发问题
- 删除元素时使用 STL 映射的迭代器时遇到问题
- 在 C 语言中打印映射/过滤器/减少函数时出现问题
- STL 映射和指针出现问题
- 为对象指针映射编写函数模板时出现问题
- boost的问题::内存映射~500MB,外部USB文件
- Netbeans IDE 8.0.2 C++代码辅助问题映射与向量值声明
- STL 中的一些问题映射和列表使用 c++ 使用