枚举类的关系运算符重载

时间:2016-06-26 07:41:44

标签: c++ visual-c++ enums overloading

我试图为实验目的重载一个小于运算符的枚举类时遇到了问题,但令人惊讶的是它只适用于一元运算符,即++。编译器抱怨歧义:

PERSISTED

编译器显然在全局范围内找到了另一个不足的运算符,但是为什么它不会使重载的运算符完全匹配?

2 个答案:

答案 0 :(得分:4)

这是一个自2010年以来一直开放的Visual C ++编译器错误,微软显然不会很快修复它。

请参阅Visual Studio bug 529700

  

我可以确认这是Visual C ++的一个错误。不幸的是   不符合当前版本的Visual C ++的分类栏 -   但我们会将问题保留在我们的数据库中,我们会对其进行研究   在Visual C ++未来版本的开发阶段再次出现。

一个好的解决方法取决于你想要达到的目标。例如,如果您想将Fruit放入标准容器类(如std::mapstd::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();
}