【发布时间】:2010-03-26 12:25:46
【问题描述】:
这是我的第一个问题:)
我将程序的配置存储在 Group->Key->Value 形式中,就像旧的 INI 一样。我将信息存储在一对结构中。
第一个,我使用std::map 和字符串+ptr 作为组信息(字符串键中的组名)。第二个std::map 值是指向第二个结构的指针,它是std::maps 的std::list,结尾是Key->Value 对。
Key->Value对结构是动态创建的,所以配置结构是:
std::map< std::string , std::list< std::map<std::string,std::string> >* > lv1;
好吧,我正在尝试实现两种方法来检查内部配置中是否存在数据。第一个,检查结构中是否存在组:
bool isConfigLv1(std::string);
bool ConfigManager::isConfigLv1(std::string s) {
return !(lv1.find(s)==lv1.end());
}
第二种方法,让我抓狂...它检查组内是否存在密钥。
bool isConfigLv2(std::string,std::string);
bool ConfigManager::isConfigLv2(std::string s,std::string d) {
if(!isConfigLv1(s))
return false;
std::map< std::string , std::list< std::map<std::string,std::string> >* >::iterator it;
std::list< std::map<std::string,std::string> >* keyValue;
std::list< std::map<std::string,std::string> >::iterator keyValueIt;
it = lv1.find(s);
keyValue = (*it).second;
for ( keyValueIt = keyValue->begin() ; keyValueIt != keyValue->end() ; keyValueIt++ )
if(!((*keyValueIt).second.find(d)==(*keyValueIt).second.end()))
return true;
return false;
}
我不明白出了什么问题。编译器说:
ConfigManager.cpp||In member function ‘bool ConfigManager::isConfigLv2(std::string, std::string)’:|
ConfigManager.cpp|(line over return true)|error: ‘class std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >’ has no member named ‘second’|
但它必须有第二个成员,因为它是一个映射迭代器...
对正在发生的事情有什么建议吗?
对不起我的英语:P,考虑一下我是在练习,我知道有很多很酷的配置管理器。
【问题讨论】:
-
如果一段代码曾经调用过一些明智选择的
typedef语句,就是这样。 -
不要忘记对有帮助的答案进行投票;)(我并不是说您必须对某个答案进行投票,只是投票是 SO 的核心功能之一 - 请参阅有关详细信息的常见问题解答。)
标签: c++ pointers list iterator stdmap