我有一张地图:map<string, Operations>
其中,操作是一个枚举
enum class Operations
{
div,
mul,
add,
sub
};
我这样填写地图:
myMap.insert( make_pair("add", Operations::add) );
myMap.insert( make_pair("sub", Operations::sub) );
myMap.insert( make_pair("div", Operations::div) );
myMap.insert( make_pair("mul", Operations::mul) );
如何正确迭代此地图?特别是得到第二个元素?,(值)。 我收到编译错误。
以下是代码:
#include <iostream>
#include <map>
using namespace std;
enum class Operations
{
add,
sub,
div,
mul
};
template <class K, class V>
void displayMap ( map<K,V> &m )
{
typename map<K,V>::iterator inx = m.begin();
for ( ;inx != m.end(); ++inx )
{
cout << inx-> first << " " << inx->second << endl;
}
}
int main ( )
{
static map<string, Operations> myMap;
myMap.insert( make_pair ("add", Operations::add) );
myMap.insert( make_pair ("sub", Operations::sub) );
myMap.insert( make_pair ("div", Operations::div) );
myMap.insert( make_pair ("mul", Operations::mul) );
displayMap (myMap);
return 0;
}
以下是错误消息:
error: invalid operands to binary expression ('basic_ostream<char,
std::__1::char_traits<char> >' and 'Operations')
cout << inx-> first << " " << inx->second << endl;
提前致谢! LEO
答案 0 :(得分:4)
您使用的是作用域枚举,它不允许对基础类型进行隐式转换。这是C ++ 11添加它们的重点。您必须将它们显式地转换为基础类型。
#include <type_traits>
cout << inx-> first
<< " "
<< static_cast<typename std::underlying_type<V>::type>(inx->second)
<< endl;
另一方面,如果要显示枚举器值以外的内容,可以创建operator<<
重载来打印任何内容。
std::ostream& operator<<(ostream& os, Operations op)
{
switch(op)
{
case Operations::add:
return os << '+';
case Operations::sub:
return os << '-';
case Operations::div:
return os << '/';
case Operations::mul:
return os << '*';
default: throw std::runtime_error("illegal Operation");
}
}
答案 1 :(得分:1)
问题是Operations
无法打印std::ostream
,因为没有operator<<
重载(并且Operations
无法隐式转换为其基础类型)
您可以按如下方式实施:
std::ostream& operator<<(std::ostream& os, Operations op)
{
switch (op)
{
case Operations::div: return os << "div";
case Operations::mul: return os << "mul";
case Operations::add: return os << "add";
case Operations::sub: return os << "sub";
// (omit default case to enable compiler warning for missing case)
}
}
(另请注意,必须在定义Operator
的同一名称空间中定义此重载。)