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