std :: map on gcc 3.2.3 Red Hat Linux 3.2.3-20

时间:2016-06-13 05:22:52

标签: c++ gcc redhat

我是一家半导体公司的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上,我使它编译并正确运行。但是,在红帽上,它显示错误低于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 :: 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;
}

仍然会产生如下错误:

enter image description here

2:当我在作业文件中添加源代码时,我确认该行上有tab而不是8空白,但仍显示缺少分隔符错误。enter image description here

4 个答案:

答案 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)进行详细讨论。

仍然,感谢您的参与和讨论。