Что вернется, если элемент карты не найден? - PullRequest
1 голос
/ 21 ноября 2011

Мой заголовок C ++ содержит несколько фрагментов кода, например:

private:
    std::map<std::string, std::vector<std::vector<unsigned short> > > m_usIRDataPool;

public:
    std::vector<std::vector<unsigned short> >& IRChannelData(std::string sChannelName);

В своем файле реализации (.cpp) IRChannelData() имеет следующее определение:

std::vector<std::vector<unsigned short> >& MyClass::IRChannelData(std::string sChannelName)
{   
    std::map<std::string, std::vector<std::vector<unsigned short> > >::iterator it = m_usIRDataPool.find( sChannelName );

    if ( it != m_usIRDataPool.end() )
    {  
       return it->second;
    }

  //  return ????; // How can I return?
}

Итак, что будет возвращаться, если в контейнере карты m_usIRDataPool не найдена запись (вектор вектора), чтобы избавиться от

warning C4715: 'MyClass::IRChannelData' : not all control paths return a value.

Ответы [ 3 ]

3 голосов
/ 21 ноября 2011
  • Возвращает bool, указывающий на успех / неудачу, и возвращает адрес вектора результата с помощью параметра семантики "out", или
  • выдает исключение, если элемент не найден в карте
0 голосов
/ 21 ноября 2011

Поскольку вы возвращаете ссылку на что-то, вы не можете объявить пустую карту в функции и затем вернуть ее. Что вы можете сделать, это объявить переменную в MyClass MyClass::emptyReturnMap того же типа, который вы хотите вернуть std::vector<std::vector<unsigned short> >, а затем вернуть ее. Но если вы редактируете его содержимое (поскольку возврат не является константой), вам придется очищать его при каждом вызове.

0 голосов
/ 21 ноября 2011

Верните указатель и верните 0, если вы не нашли то, что искали.

...