#include <string>
#include <functional>
#include <unordered_set>
template<typename T> class BaseB {
protected:
std::string ms;
private:
struct hashstruct {
std::size_t operator()(const T & b) const {
return b.hash();
}
};
public:
bool operator==(const T & b) const {
return ms == b.ms;
}
virtual std::size_t hash() const = 0;
typedef std::unordered_set<T, hashstruct> Set;
};
class B01 : public BaseB<B01> {
public:
std::size_t hash() const {
return std::hash<std::string>{}(ms) ^ 1;
}
};
class B02 : public BaseB<B02> {
public:
std::size_t hash() const {
return std::hash<std::string>{}(ms) ^ 2;
}
};
class B03 : public B01 , public B02, public BaseB<B03>{
public:
std::size_t hash() const {
return 0;
}
};
int main(int iArgs, char * args[]) {
B01::Set setOfB01;
setOfB01.insert(B01());
B02::Set setOfB02;
setOfB02.insert(B02());
B03::Set setOfB03;
setOfB03.insert(B03());
return 0;
};
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgQmFzZUIgewoKICAgIHByb3RlY3RlZDoKICAgICAgICBzdGQ6OnN0cmluZyBtczsKCiAgICBwcml2YXRlOgogICAgICAgIHN0cnVjdCBoYXNoc3RydWN0IHsKICAgICAgICAgICAgc3RkOjpzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBUICYgYikgY29uc3QgewogICAgICAgICAgICAgICAgcmV0dXJuIGIuaGFzaCgpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICBwdWJsaWM6CiAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFQgJiBiKSBjb25zdCB7CiAgICAgICAgICAgIHJldHVybiBtcyA9PSBiLm1zOwogICAgICAgIH0KCiAgICAgICAgdmlydHVhbCBzdGQ6OnNpemVfdCBoYXNoKCkgY29uc3QgPSAwOwoKICAgICAgICB0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX3NldDxULCBoYXNoc3RydWN0PiBTZXQ7Cn07CgpjbGFzcyBCMDEgOiBwdWJsaWMgQmFzZUI8QjAxPiB7CgogICAgcHVibGljOgogICAgICAgIHN0ZDo6c2l6ZV90IGhhc2goKSBjb25zdCB7CiAgICAgICAgICAgIHJldHVybiBzdGQ6Omhhc2g8c3RkOjpzdHJpbmc+e30obXMpIF4gMTsKICAgICAgICB9Cn07CgpjbGFzcyBCMDIgOiBwdWJsaWMgQmFzZUI8QjAyPiB7CgogICAgcHVibGljOgogICAgICAgIHN0ZDo6c2l6ZV90IGhhc2goKSBjb25zdCB7CiAgICAgICAgICAgIHJldHVybiBzdGQ6Omhhc2g8c3RkOjpzdHJpbmc+e30obXMpIF4gMjsKICAgICAgICB9Cn07CmNsYXNzIEIwMyA6IHB1YmxpYyBCMDEgLCBwdWJsaWMgQjAyLCBwdWJsaWMgQmFzZUI8QjAzPnsKCQoJICAgIHB1YmxpYzoKICAgICAgICBzdGQ6OnNpemVfdCBoYXNoKCkgY29uc3QgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9Cn07CgppbnQgbWFpbihpbnQgaUFyZ3MsIGNoYXIgKiBhcmdzW10pIHsKCiAgICBCMDE6OlNldCBzZXRPZkIwMTsKICAgIHNldE9mQjAxLmluc2VydChCMDEoKSk7CgogICAgQjAyOjpTZXQgc2V0T2ZCMDI7CiAgICBzZXRPZkIwMi5pbnNlcnQoQjAyKCkpOwogICAgCiAgICBCMDM6OlNldCBzZXRPZkIwMzsKICAgIHNldE9mQjAzLmluc2VydChCMDMoKSk7CgogICAgcmV0dXJuIDA7Cn07
prog.cpp: In function 'int main(int, char**)':
prog.cpp:58:5: error: reference to 'Set' is ambiguous
B03::Set setOfB03;
^
prog.cpp:24:51: note: candidates are: typedef class std::unordered_set<B03, BaseB<B03>::hashstruct, std::equal_to<B03>, std::allocator<B03> > BaseB<B03>::Set
typedef std::unordered_set<T, hashstruct> Set;
^
prog.cpp:24:51: note: typedef class std::unordered_set<B02, BaseB<B02>::hashstruct, std::equal_to<B02>, std::allocator<B02> > BaseB<B02>::Set
prog.cpp:24:51: note: typedef class std::unordered_set<B01, BaseB<B01>::hashstruct, std::equal_to<B01>, std::allocator<B01> > BaseB<B01>::Set
prog.cpp:59:5: error: 'setOfB03' was not declared in this scope
setOfB03.insert(B03());
^