我正在尝试创建一个模板函数,它将遍历地图指定的键/值对,并检查函数参数中是否存在任何键。
实施如下:
代码
template < class Key, class Value >
bool CheckMapForExistingEntry( const std::map< Key, Value >& map, const std::string& key )
{
std::map< Key, Value >::iterator it = map.lower_bound( key );
bool keyExists = ( it != map.end && !( map.key_comp() ( key, it->first ) ) );
if ( keyExists )
{
return true;
}
return false;
}
然而,无论出于何种原因,我似乎无法弄清楚为什么我的代码无法编译。我反而得到了这些错误:
error: expected ';' before 'it'
error: 'it' was not declared in this scope
我之前遇到过这些,但这些通常是由于我所犯的错误很容易发现。可能会发生什么?
答案 0 :(得分:5)
非常确定您需要typename
限定符:
template < class Key, class Value >
bool CheckMapForExistingEntry( const std::map< Key, Value >& map, const std::string& key )
{
typename std::map< Key, Value >::iterator it = map.lower_bound( key );
bool keyExists = ( it != map.end && !( map.key_comp() ( key, it->first ) ) );
if ( keyExists )
{
return true;
}
return false;
}
This article相当详细地解释了。
有效地,编译器知道std::map< Key, Value >
和Key
的某些值可能存在Value
的特化,其中可能包含名为{{1}的static
变量}}。所以它需要iterator
限定符来确保它实际上是指这里的类型而不是一些假定的静态变量。