我试图为实验目的重载一个小于运算符的枚举类时遇到了问题,但令人惊讶的是它只适用于一元运算符,即++。编译器抱怨歧义:
PERSISTED
编译器显然在全局范围内找到了另一个不足的运算符,但是为什么它不会使重载的运算符完全匹配?
答案 0 :(得分:4)
这是一个自2010年以来一直开放的Visual C ++编译器错误,微软显然不会很快修复它。
我可以确认这是Visual C ++的一个错误。不幸的是 不符合当前版本的Visual C ++的分类栏 - 但我们会将问题保留在我们的数据库中,我们会对其进行研究 在Visual C ++未来版本的开发阶段再次出现。
一个好的解决方法取决于你想要达到的目标。例如,如果您想将Fruit
放入标准容器类(如std::map
或std::set
),您可能需要考虑专门化std::less
:
namespace std
{
template<>
struct less<Fruit>
{
bool operator()(Fruit const& lhs, Fruit const& rhs) const
{
// your comparison logic
}
};
}
std::set<Fruit> s;
或者您为此目的定义了一个仿函数类:
struct FruitComparison
{
bool operator()(Fruit const& lhs, Fruit const& rhs) const
{
// your comparison logic
}
};
std::set<Fruit, FruitComparison> s;
如果需要算法的比较,那么您可能想要使用lambda:
std::vector<Fruit> v;
std::sort(begin(v), end(v), [](Fruit const& lhs, Fruit const& rhs)
{
// your comparison logic
});
答案 1 :(得分:0)
对我有用的另一种解决方法(除了Christian Hackl之外):
1)将您的运算符放在一个命名空间下(在某些情况下-与原始枚举相同的命名空间):
namespace App
{
enum class Fruit
{
apple,
banana,
// ...
};
bool operator<(Fruit l, Fruit r)
{
return true;
}
}
2)用全名(包括名称空间)呼叫operator<
:
namespace App
{
void foo()
{
Fruit f = Fruit::banana;
Fruit a = Fruit::apple;
std::cout << App::operator<(a, f);
}
}
int main()
{
App::foo();
}