我有一个问题,我不明白为什么会发生这种情况。简而言之,我想创建一个单例来读取配置文件,其中每个属性都将存储在地图中。
我将配置类(.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;
问题是,我的变量属性是Configuration的类型而不是map。如果将键和值替换为int,则属性将成为映射。这看起来很奇怪。
我在我的头文件中包含了字符串。
没有异常或错误。我的意思是,编译运行良好而不是错误。但是,我的地图总是空的。在eclipse上调试它我注意到变量属性的类型是Configuration而不是map。
当我将键和值类型从string更改为int时,对象属性的类型为map。
你以前见过吗?我在这里缺少什么?由于 莫罗
答案 0 :(得分:0)
这似乎是一个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的错误,使用静态地图时你的代码不会有任何问题。
如果这种情况没有错误,那就是一个问题。