2016-06-13 74 views
0

我是半導體公司的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

回答

0

錯誤表示功能std::map::at在您的環境中不存在。

此函數在C++ 11中引入,因此您的舊GCC版本不支持它。

嘗試用替代方法替換此功能,如std::map::find或類似方法。

0

您可以實現的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

0

你實現mapAt接受的第一個參數作爲非const引用:

T2 mapAt(std::map<T1, T2, T3, T4>& m, const T1& key) 

但你嘗試從const方法INIReader::Get,其中_values被視爲一個常量map內調用它。

如果你沒有明確的修改意圖,通常最好聲明ref-arguments爲const

+0

謝謝。我沒有發現錯誤。 –

0

我在這裏嘗試了一些建議,仍然存在一些問題。所以我提出了一個項目的github回購問題,作者給出了一個驗證的解決方案。它將_values.at(key)更改爲_values.find(key)->second

我剛查過並確認它在這裏有效。你可以去這個網站(https://github.com/benhoyt/inih/issues/49)進行詳細的討論。

不過,感謝您的參與和討論。