У меня есть шаблонный класс, реализующий красное черное дерево, которое будет вести себя как карта (псевдо). 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 в списке аргументов шаблона". Странно, если я поменяю сравнение на <=
, он компилируется отлично. Однако в тот момент я уже знаю, что это не равны (первый чек так <
будет делать.
Как я могу это исправить, и почему он жалуется на один оператор, а не другие?
Без синтаксических ошибок, он компилируется для меня отлично. –
Может быть https://gcc.gnu.org/bugzilla/show_bug.cgi?id=10200. У вас есть шаблон, называемый 'data' где-то? –
@ T.C. Да, ничего себе! Это супер-странно. Изменено имя, и оно работает. Не могли бы вы передать это как ответ? Спасибо, это спасло мне много тщетных попыток решить эту проблему. Я никак не мог понять это сам. Ошибка в компиляторе, hm. – Resurrection