#include "stdio.h"
namespace A {
template <typename T>
struct Key {
T value;
};
template <
typename T,
template<typename> class KeyType
>
bool operator==(const KeyType<T> &a, const KeyType<T> &b) {
return a.value == b.value;
}
}
namespace B {
template <typename KT>
struct MappedVal {
KT key;
};
template <
typename KT,
template<typename> class MappedType
>
bool operator==(const MappedType<KT> &a, const MappedType<KT> &b) {
return (a.key == b.key);
}
}
int main() {
A::Key<short> key1, key2;
key1.value = 1;
key2.value = 1;
B::MappedVal<A::Key<short> > val1, val2;
val1.key = key1;
val2.key = key1;
bool test1 = (key1 == key2);
bool test2 = (val1 == val2);
printf("key1 == key2: %s\n", (test1 ? "true" : "false"));
printf("val1 == val2: %s\n", (test2 ? "true" : "false"));
return 0;
}
I2luY2x1ZGUgInN0ZGlvLmgiCgpuYW1lc3BhY2UgQSB7CiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgIHN0cnVjdCBLZXkgewogICAgICBUIHZhbHVlOwogICAgfTsKCiAgICB0ZW1wbGF0ZSA8CiAgICAgICAgdHlwZW5hbWUgVCwKICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgS2V5VHlwZQogICAgPgogICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEtleVR5cGU8VD4gJmEsIGNvbnN0IEtleVR5cGU8VD4gJmIpIHsKICAgICAgcmV0dXJuIGEudmFsdWUgPT0gYi52YWx1ZTsKICAgIH0KfQpuYW1lc3BhY2UgQiB7CiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgS1Q+CiAgICBzdHJ1Y3QgTWFwcGVkVmFsIHsKICAgICAgS1Qga2V5OwogICAgfTsKCiAgICB0ZW1wbGF0ZSA8CiAgICAgICAgdHlwZW5hbWUgS1QsCiAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWU+IGNsYXNzIE1hcHBlZFR5cGUKICAgID4KICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYXBwZWRUeXBlPEtUPiAmYSwgY29uc3QgTWFwcGVkVHlwZTxLVD4gJmIpIHsKICAgICAgcmV0dXJuIChhLmtleSA9PSBiLmtleSk7CiAgICB9Cn0KCmludCBtYWluKCkgewogIEE6OktleTxzaG9ydD4ga2V5MSwga2V5MjsKICBrZXkxLnZhbHVlID0gMTsKICBrZXkyLnZhbHVlID0gMTsKCiAgQjo6TWFwcGVkVmFsPEE6OktleTxzaG9ydD4gPiB2YWwxLCB2YWwyOwogIHZhbDEua2V5ID0ga2V5MTsKCiAgdmFsMi5rZXkgPSBrZXkxOwoKICBib29sIHRlc3QxID0gKGtleTEgPT0ga2V5Mik7CiAgYm9vbCB0ZXN0MiA9ICh2YWwxID09IHZhbDIpOwoKICBwcmludGYoImtleTEgPT0ga2V5MjogJXNcbiIsICh0ZXN0MSA/ICJ0cnVlIiA6ICJmYWxzZSIpKTsKICBwcmludGYoInZhbDEgPT0gdmFsMjogJXNcbiIsICh0ZXN0MiA/ICJ0cnVlIiA6ICJmYWxzZSIpKTsKCiAgcmV0dXJuIDA7Cn0=
prog.cpp: In function ‘int main()’:
prog.cpp:43:22: error: ambiguous overload for ‘operator==’ (operand types are ‘B::MappedVal<A::Key<short int> >’ and ‘B::MappedVal<A::Key<short int> >’)
bool test2 = (val1 == val2);
^
prog.cpp:43:22: note: candidates are:
prog.cpp:27:10: note: bool B::operator==(const MappedType<KT>&, const MappedType<KT>&) [with KT = A::Key<short int>; MappedType = B::MappedVal]
bool operator==(const MappedType<KT> &a, const MappedType<KT> &b) {
^
prog.cpp:13:10: note: bool A::operator==(const KeyType<T>&, const KeyType<T>&) [with T = A::Key<short int>; KeyType = B::MappedVal]
bool operator==(const KeyType<T> &a, const KeyType<T> &b) {
^