0

我一直在尝试使用自动返回类型模板并且遇到了麻烦。我想创建一个接受 STL 映射并返回对映射中索引的引用的函数。我从这段代码中遗漏了什么以使其正确编译?

(注意:我假设地图可以用 0 的整数赋值来初始化。我可能会在稍后添加一个 boost 概念检查以确保它被正确使用。)

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++;
4

1 回答 1

2

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

哪个更明确!

于 2011-10-11T19:50:00.327 回答