2

私は C++98 しか使えずstd::map::at()、C++11 で追加された実装にはアクセスできません。

私の目標は、のように動作する非メンバー関数at()関数 (C++98 を使用) を作成することですstd::map::at()

したがって、次の非メンバー関数を作成しました。

template<typename K, typename V>
V& at(std::map<K, V> map, K key)
{
  if (map.find(key) == map.end())
    throw std::out_of_range("key not found");
  return map.find(key)->second;
}

私のバージョンがコピーを返したかのように動作するという問題が少なくとも 1 つあります (以下を参照)。

std::map<int,int> myMap;
myMap.insert(std::pair<int,int>(2,43));

// myMap.at(2)=44;            // modifies the reference
// assert(44==myMap.at(2));   // fine 

at(myMap,2)=44;               // does not modify the value inside the map, why?
assert(44==myMap.at(2));      // not fine
  1. どうすればこの問題に対処できますか?
  2. ラッパーに他に問題はありますか?
4

3 に答える 3

2

署名をに変更します

V& at(std::map<K, V>& map, K key)
于 2013-10-24T13:30:32.653 に答える