std :: map on gcc 3.2.3 Red Hat Linux 3.2.3-20
我是半导体公司的ATE工程师,我需要开发以及维护测试程序。最近我想在ATE平台上添加一个配置文件解析功能。但是,标准测试平台并不是最新的(我不确定这是否会导致问题)。std :: map on gcc 3.2.3 Red Hat Linux 3.2.3-20
我检查了一些资源,发现了几个候选人:getpot(http://getpot.sourceforge.net/),inih(https://github.com/benhoyt/inih)。与这两个,我可以直接编译和运行在我的Windows 7与GCC 4.8.1。但是,我将不得不在我的ATE Red Hat 3.2.3上使用它。我无法更改平台(例如更新gcc版本,安装新软件包),但我可以将所有必需的代码都包含为原始文件。
以下是我与inih尝试:
1:我复制的代码共享文件夹(主机的窗口和虚拟机红帽之间)。在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 ::地图::在如下图所示:
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;
}
,仍然会生成如下错误:
错误表示功能std::map::at
在您的环境中不存在。
此函数在C++ 11中引入,因此您的旧GCC版本不支持它。
尝试用替代方法替换此功能,如std::map::find
或类似方法。
您可以实现的std ::地图::你自己,对于〔实施例:
#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;
}
嗨,我已经把显示错误的代码的原始部分。所以为了在自己的代码中添加这个std :: map ::,我只需要复制你的T2代码部分,并将原始代码修改为mapAT?或者还有其他必要的工作吗? – Jinstrong
@Jinstrong,如果你想模拟'std :: map :: at'如何处理缺失的项目,或者你可以简单地返回默认值,你需要'#include
HI Keyu,我只是试着按照你的建议,出现了一个新的错误: – Jinstrong
你实现mapAt
接受的第一个参数作为非const引用:
T2 mapAt(std::map<T1, T2, T3, T4>& m, const T1& key)
但你尝试从const
方法INIReader::Get
,其中_values
被视为一个常量map
内调用它。
如果你没有明确的修改意图,通常最好声明ref-arguments为const
。
谢谢。我没有发现错误。 –
我在这里尝试了一些建议,仍然存在一些问题。所以我提出了一个项目的github回购问题,作者给出了一个验证的解决方案。它将_values.at(key)
更改为_values.find(key)->second
。
我刚查过并确认它在这里有效。你可以去这个网站(https://github.com/benhoyt/inih/issues/49)进行详细的讨论。
不过,感谢您的参与和讨论。
根据[GCC](https://gcc.gnu.org/releases.html)网站,GCC 3.2.3于2003-04-23发布。这会变成古董(并且已经有好几年了)。如果您无法升级编译器,请降级源代码,以便它可以与旧版本的标准一起使用。 –
嗨乔纳森,理解,这是我正在尝试做的 - 降级。只是我不是C++的专家,因此我来到这里寻求建议/帮助。 – Jinstrong
请不要更新问题和跟进问题。其中一个答案解决了您的问题。接受它并在跟进中提出一个新问题。否则,很难遵循正在发生的事情。 – pmr