在模板函数中使用auto和decltype

时间:2011-10-11 19:47:06

标签: c++ c++11 decltype auto

我一直在尝试使用自动返回类型模板,但遇到了麻烦。我想创建一个接受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 个答案:

答案 0 :(得分:2)

在后缀返回类型声明中的MapType之前添加typename

如果您忘记添加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

哪个更明确!