Использование auto и decltype в шаблонных функциях - PullRequest
0 голосов
/ 11 октября 2011

Я пытался использовать шаблоны с автоматическим возвратом и у меня возникли проблемы.Я хочу создать функцию, которая принимает карту STL и возвращает ссылку на индекс в карте.Чего мне не хватает в этом коде, чтобы он правильно компилировался?

(Примечание: я предполагаю, что карту можно инициализировать с целочисленным присваиванием, равным 0. Я, скорее всего, добавлю проверку концепции повышения позже, чтобы убедиться, чтоиспользуется правильно.)

template <typename MapType>
// The next line causes the error: "expected initializer"
auto FindOrInitialize(GroupNumber_t Group, int SymbolRate, int FecRate, MapType Map) -> MapType::mapped_type&
{
    CollectionKey Key(Group, SymbolRate, FecRate);
    auto It = Map.find(Key);
    if(It == Map.end())
        Map[Key] = 0;
    return Map[Key];
}

Пример кода, который вызывает эту функцию:

auto Entry = FindOrInitialize(Group, SymbolRate, FecRate, StreamBursts);
Entry++;

1 Ответ

2 голосов
/ 11 октября 2011

Добавьте typename перед MapType в объявлении типа возвращаемого суффикса.

Если вы забудете добавить typename, вы получите такую ​​ошибку (здесь GCC 4.6.0):

test.cpp:2:28: error: expected type-specifier
test.cpp:2:28: error: expected initializer

Это даст вам что-то вроде:

template <typename MapType>
auto FindOrInitialize() -> MapType::mapped_type&
{
    ...
}

Но для того, что вы пытаетесь сделать, нет необходимости использовать суффиксный синтаксис:

template <typename MapType>
typename MapType::mapped_type& FindOrInitialize() 
{
    ...
}

Здесь, если вы забудетеtypename вы получите сообщение об ошибке, подобное:

test.cpp:2:1: error: need ‘typename’ before ‘MapType::mapped_type’ because ‘MapType’ is a dependent scope

Что гораздо более явно!

...