2015-12-06 4 views
2

У меня есть шаблонный класс, реализующий красное черное дерево, которое будет вести себя как карта (псевдо). Pseudo-map, потому что он не будет хранить ключи, только значения, при этом ключи будут встроены в значения. Для этого необходимо, чтобы оператор == и оператор < перегружали, чтобы проверить сохраненные значения на произвольный ключ и снова перебирать друг друга (используя встроенный ключ). Например.Меньше сравнения аргументов шаблона

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); не с ошибкой "parse error в списке аргументов шаблона". Странно, если я поменяю сравнение на <=, он компилируется отлично. Однако в тот момент я уже знаю, что это не равны (первый чек так < будет делать.

Как я могу это исправить, и почему он жалуется на один оператор, а не другие?

+1

Без синтаксических ошибок, он компилируется для меня отлично. –

+2

Может быть https://gcc.gnu.org/bugzilla/show_bug.cgi?id=10200. У вас есть шаблон, называемый 'data' где-то? –

+0

@ T.C. Да, ничего себе! Это супер-странно. Изменено имя, и оно работает. Не могли бы вы передать это как ответ? Спасибо, это спасло мне много тщетных попыток решить эту проблему. Я никак не мог понять это сам. Ошибка в компиляторе, hm. – Resurrection

ответ

0

ТС отправил ответьте в комментариях, поэтому я просто повторю его как ответ. Поведение связано с давней ошибкой в ​​GCC https://gcc.gnu.org/bugzilla/show_bug.cgi?id=10200, которая проявляется, когда человек не очень креативен с именованием и имеет кучу одинаковых имен в классе (в этом переменная члена-члена с именем data во вложенном классе и метод-член, называемый data в суперклассе).

Смежные вопросы