Как создать функцию с возвращаемым типом карты <>? - PullRequest
4 голосов
/ 04 июня 2010

Довольно простой вопрос. У меня есть карта, которую я хочу инициализировать, вызвав такую ​​функцию:

map<string, int> myMap;

myMap = initMap( &myMap );

map<string, int> initMap( map<string, int> *theMap )
{
    /* do stuff... */

Тем не менее, компилятор стонет. Какое решение для этого?

РЕДАКТИРОВАТЬ 1:

Извините, но я облажался. Код был правильно написан с помощью *theMap, но когда я опубликовал вопрос, я не заметил, что пропустил *. Чтобы ответить на комментарий, я получаю сообщение об ошибке:

1>Roman_Numerals.cpp(21): error C2143: syntax error : missing ';' before '<'

, который брошен в

map<char, int> initMap( map<char, int> *numerals );

с использованием VC ++ 2010 Express и снова та же ошибка при определении функции.

Ответы [ 8 ]

14 голосов
/ 04 июня 2010

Либо сделать:

map<string, int> myMap;
initMap( myMap );

void initMap( map<string, int>& theMap )
{
    /* do stuff in theMap */
}

или сделайте:

map<string, int> myMap;
myMap = initMap(  );

map<string, int> initMap()
{
    map<string, int> theMap;
    /* do stuff in theMap */
    return theMap;
}

т.е. позвольте функции инициализировать карту, которую вы ей дали, или взять карту, которую вам дает функция. Вы делаете оба (без оператора return тоже!)

Я бы выбрал первый вариант.

8 голосов
/ 04 июня 2010

Это, вероятно, жалуется, потому что вы передаете адрес карты, но ваша функция принимает карту по значению.

Возможно, вы захотите что-то еще подобное:

void initMap(map<string, int>& theMap)
{
    /* do stuff...*/
}
3 голосов
/ 04 июня 2010

Каноническое решение просто

std::map<std::string, int> initMap();
// ...
std::map<std::string, int> myMap = initMap();

Почему хитрая попытка использовать входной параметр для возвращаемого значения? Спектакль? Современным компиляторам все равно. Фактически, не создание пустой карты будет немного быстрее.

3 голосов
/ 04 июня 2010

Вы должны принять указатель или предпочтительно ссылку на карту. Вы также можете вернуть ссылку для удобства:

map<string, int>& initMap( map<string, int>& theMap )
...
// Call initMap
map<string, int> my_map;
initMap(my_map);
1 голос
/ 04 июня 2010

&myMap - указатель на объект карты, а аргумент theMap - объект карты.

Два решения:

Изменить myMap = initMap( &myMap ); на myMap = initMap( myMap );.

или

Изменить map<string, int> initMap( map<string, int> theMap ) на map<string, int> initMap( map<string, int> * theMap ).

1 голос
/ 04 июня 2010

почему бы не сделать void initMap (map & theMap) вместо того, чтобы делать так много копий карты?

0 голосов
/ 09 января 2016

Немного опоздал к игре, но: Я думаю, из сообщения об ошибке, что вы пропускаете

#include <map>

вверху вашего кода. Таким образом, компилятор не знает, что карта должна быть шаблоном, и поэтому он запутывается в следующих угловых скобках.

0 голосов
/ 28 декабря 2014
 void initMap(map<String,int> &Map)
 {
   //Do something
 }
...