少于模板参数的比较

Less than comparison of template arguments

本文关键字:比较 参数 于模板      更新时间:2023-10-16

我有一个实现红黑树的模板类,它的行为有点像(伪)映射。伪映射,因为它不存储键,只存储值,键嵌入值中。它将需要运算符==和运算符<重载以针对任意密钥和彼此(使用嵌入式密钥)测试存储的值。例如

struct Val
{
    //some actual data
    std::string key;
    bool operator==(const Val &val) { return this->key == val.key; }
    bool opeartor==(const std::string &str) { return this->key == str; }
    bool opeartor<(const Val &val) { return this->key < val.key; }
    bool opeartor<(const std::string &str) { return this->key < str; }
};

这种"值"将进入这个模板化的类:

template<typename T>
class Map
{
    struct Node
    {
        //...
        T data;
    };
    public:
        //..
        template<typename K> T value(const K &key) const
        {
            Node *it;
            //...
            if(it->data == key)
            //...
            int dir = (it->data < key);
            //...
        }
};

然而,虽然行if(it->data == key)检查得很好(我还没有使用该类),但第二行int dir = (it->data < key);没有出现错误"在模板参数列表中解析错误"。奇怪的是,如果我将比较更改为<=,它编译得很好。然而,在那一点上,我已经知道它是不相等的(第一次检查,所以<可以。

我该如何修复它?为什么它抱怨一个操作员而不是其他操作员?

T.C.已经在评论中发布了答案,所以我将重复它作为答案。这种行为是由于GCC中长期存在的错误造成的https://gcc.gnu.org/bugzilla/show_bug.cgi?id=10200当一个人在命名方面不太有创意,并且在类中有一堆相同的名称时(在这种情况下,嵌套类中的成员变量名为data,超类中的会员方法名为data),它就会表现出来。