我是一家半导体公司的ATE工程师,我需要开发和维护测试程序。最近我想在ATE平台上添加配置文件解析功能。但是,标准测试平台不是最新的(我不确定这是否会导致问题)。
我检查了一些资源并找到了几个候选人:getpot(http://getpot.sourceforge.net/),inih(https://github.com/benhoyt/inih)。有了这两个,我可以直接使用gcc 4.8.1在我的Windows 7上编译和运行。但是我必须在我的ATE Red Hat 3.2.3上使用它。我无法更改平台(例如更新gcc版本,安装新软件包),但我可以将所有必需的代码包含为原始文件。
以下是我尝试过的内容:
1:我将代码复制到共享文件夹(主机窗口和虚拟redhat机器之间)。在Windows上,我使它编译并正确运行。但是,在红帽上,它显示错误低于。这是显示错误的部分:
string INIReader::Get(string section, string name, string default_value) const
{
string key = MakeKey(section, name);
return _values.count(key) ? _values.at(key) : default_value;
}
我只是尝试修改它以实现std :: map :: at,如下所示:
template<typename T1, typename T2, typename T3, typename T4>
T2 mapAt(std::map<T1, T2, T3, T4>& m, const T1& key)
{
typeof(m.begin()) mit = m.find(key);
if (mit == m.end() || mit->first != key)
{
throw std::out_of_range("map::at");
}
return mit->second;
}
string INIReader::Get(string section, string name, string default_value) const
{
string key = MakeKey(section, name);
return _values.count(key) ? mapAt(_values, key) : default_value;
}
仍然会产生如下错误:
答案 0 :(得分:0)
错误表明您的环境中不存在函数std::map::at
。
此函数是在C ++ 11中引入的,因此您的旧GCC版本不支持它。
尝试将此功能替换为std::map::find
或类似的替代品。
答案 1 :(得分:0)
你可以自己实现std :: map ::例如:
#include <iostream>
#include <stdexcept>
#include <map>
template<typename T1, typename T2, typename T3, typename T4>
T2 mapAt(std::map<T1, T2, T3, T4>& m, const T1& key)
{
typeof(m.begin()) mit = m.find(key);
if (mit == m.end() || mit->first != key)
{
throw std::out_of_range("map::at");
}
return mit->second;
}
int main()
{
std::map<int, int> mp;
mp[2] = 3;
std::cout<<mapAt(mp, 2)<<std::endl;
std::cout<<mapAt(mp, 3)<<std::endl; // will raise an exception
return 0;
}
抱歉,我错误地实现了模板(对于std :: string这是不正确的,对不起,我不知道如何纠正它)。这是一个降级版本。它限制了地图的类型,但应该适用于每个C ++版本。
std::string& mapAt(std::map<std::string, std::string>& m, const std::string& key)
{
std::map<std::string, std::string>::iterator mit = m.find(key);
if (mit == m.end() || mit->first != key)
{
throw std::out_of_range("map::at");
}
return mit->second;
}
答案 2 :(得分:0)
if($options['data']->getDescription()->isEmpty()){
$options['data']->getDescription()->set('fr',null);
$options['data']->getDescription()->set('en',null);
}
$builder->add('description',CollectionType::class,array(
'label'=>'MyBundle.messages.description',
'entry_type'=>TextType::class,
'entry_options'=>array(
'label'=>'JCABundle.messages.language_name.'.[active entry value]
)
));
的实现接受其第一个参数为非const引用:
mapAt
但您尝试从T2 mapAt(std::map<T1, T2, T3, T4>& m, const T1& key)
方法const
内部调用它,其中INIReader::Get
被视为常量_values
。
通常最好将ref-arguments声明为map
,前提是您没有明确的修改意图。
答案 3 :(得分:0)
我在这里尝试了一些建议,但仍然存在一些问题。所以我在项目的github repo上提出了一个问题,作者提供了一个经过验证的解决方案。将_values.at(key)
更改为_values.find(key)->second
。
我刚检查并确认它在这里有效。您可以访问此站点(https://github.com/benhoyt/inih/issues/49)进行详细讨论。
仍然,感谢您的参与和讨论。