Операторы-функции vs операторы-члены
От: GhostCoders Россия  
Дата: 20.02.14 05:36
Оценка: -1
Здравствуйте!

Есть код который не собирается (кусок кода без смысла, показывающий суть):

#include "stdio.h"

namespace A {
    template <typename T>
    struct Key {
      T value;
    };

    template <typename Key>
    bool operator==(const Key &a, const Key &b) {
      return a.value == b.value;
    }
}
namespace B {
    template <typename KT, typename VT>
    struct MappedVal {
      VT value;
      A::Key<KT> key;
    };

    template <typename MappedVal>
    bool operator==(const MappedVal &a, const MappedVal &b) {
      return (a.key == b.key && a.value == b.value);
    }
}

int main() {
  A::Key<short> key1, key2;
  key1.value = 1;
  key2.value = 1;

  B::MappedVal<short, double> val1, val2;
  val1.key = key1;
  val1.value = 12.41;

  val2.key = key1;
  val2.value = 12.41;

  bool test1 = (key1 == key2);
  bool test2 = (val1 == val2);

  printf("key1 == key2: %s", (test1 ? "true" : "false"));
  printf("val1 == val2: %s", (test2 ? "true" : "false"));

  return 0;
}


если сделать операторы функциями-членами, то все компилируется:

#include "stdio.h"
#include <vector>

namespace A {
    template <typename T>
    struct Key {
      T value;
      
        template <typename Key>
        bool operator==(const Key &b) {
          return this->value == b.value;
        }
    };
}
namespace B {
    template <typename KT, typename VT>
    struct MappedVal {
      VT value;
      A::Key<KT> key;

        template <typename MappedVal>
        bool operator==(const MappedVal &b) {
          return (this->key == b.key && this->value == b.value);
        }
    };
}

int main() {
  A::Key<short> key1, key2;
  key1.value = 1;
  key2.value = 1;

  B::MappedVal<short, double> val1, val2;
  val1.key = key1;
  val1.value = 12.41;

  val2.key = key1;
  val2.value = 12.41;

  bool test1 = (key1 == key2);
  bool test2 = (val1 == val2);
  
  if (test1 && test2)
  {
    printf("OK\n");
  }else
  {
    printf("failure\n");      
  }

  return 0;
}


Стоит задача сделать код компилируемым без использования операторов-членов классов.
Какие будут идеи?
Третий Рим должен пасть!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.