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上,我编译并正确运行。但是,在红帽子上,它显示如下错误enter image description here。这里是一个显示错误的部分:

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; 
} 

,仍然会生成如下错误:

enter image description here

2:当我在工作文件中添加来源,我已经确认济,有标签,而不是上线8空白,它仍然显示失踪分离错误。 enter image description here

+0

根据[GCC](https://gcc.gnu.org/releases.html)网站,GCC 3.2.3于2003-04-23发布。这会变成古董(并且已经有好几年了)。如果您无法升级编译器,请降级源代码,以便它可以与旧版本的标准一起使用。 –

+0

嗨乔纳森,理解,这是我正在尝试做的 - 降级。只是我不是C++的专家,因此我来到这里寻求建议/帮助。 – Jinstrong

+0

请不要更新问题和跟进问题。其中一个答案解决了您的问题。接受它并在跟进中提出一个新问题。否则,很难遵循正在发生的事情。 – pmr

错误表示功能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; 
} 
+0

嗨,我已经把显示错误的代码的原始部分。所以为了在自己的代码中添加这个std :: map ::,我只需要复制你的T2代码部分,并将原始代码修改为mapAT?或者还有其他必要的工作吗? – Jinstrong

+0

@Jinstrong,如果你想模拟'std :: map :: at'如何处理缺失的项目,或者你可以简单地返回默认值,你需要'#include '(在这种情况下' stdexcept'不是必需的)。你需要将'_values.at(key)'改成'mapAt(_values,key)'。记住要从'template

+0

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

+0

谢谢。我没有发现错误。 –

我在这里尝试了一些建议,仍然存在一些问题。所以我提出了一个项目的github回购问题,作者给出了一个验证的解决方案。它将_values.at(key)更改为_values.find(key)->second

我刚查过并确认它在这里有效。你可以去这个网站(https://github.com/benhoyt/inih/issues/49)进行详细的讨论。

不过,感谢您的参与和讨论。