Здравствуйте!
Есть код который не собирается (кусок кода без смысла, показывающий суть):
#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;
}
Стоит задача сделать код компилируемым без использования операторов-членов классов.
Какие будут идеи?