#include <iostream>
using namespace std;
template<class T>
class Test;
class BeMyFriend
{
public:
template<class T>
int checkprivacy(const Test<T> areyoumyfriend)
{
std::cout << "lemme check " << areyoumyfriend.mything << std::endl;
};
BeMyFriend& operator=(const BeMyFriend& );
BeMyFriend(){std::cout << "works " << std::endl;};
};
template<class T>
class Test
{
private:
string mything= "here it is";
public:
friend T& T::operator=(const T&); //Works fine, no error
friend T&::T(const T&); //error: prototype for 'BeMyFriend::BeMyFriend(const BeMyFriend&)' does not match any in class 'BeMyFriend'
template<class D=T>
friend int T::checkprivacy(const Test<D>);
};
int main()
{
BeMyFriend yourfriend;
Test<BeMyFriend> hmm;
yourfriend.checkprivacy(hmm);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8Y2xhc3MgVD4KY2xhc3MgVGVzdDsKCiAKY2xhc3MgQmVNeUZyaWVuZAp7CglwdWJsaWM6CnRlbXBsYXRlPGNsYXNzIFQ+IAppbnQgY2hlY2twcml2YWN5KGNvbnN0IFRlc3Q8VD4gYXJleW91bXlmcmllbmQpCnsKCXN0ZDo6Y291dCA8PCAibGVtbWUgY2hlY2sgIiA8PCBhcmV5b3VteWZyaWVuZC5teXRoaW5nIDw8IHN0ZDo6ZW5kbDsKfTsKQmVNeUZyaWVuZCYgb3BlcmF0b3I9KGNvbnN0IEJlTXlGcmllbmQmICk7CkJlTXlGcmllbmQoKXtzdGQ6OmNvdXQgPDwgIndvcmtzICIgPDwgc3RkOjplbmRsO307Cn07Cgp0ZW1wbGF0ZTxjbGFzcyBUPgpjbGFzcyBUZXN0CnsKIHByaXZhdGU6CiBzdHJpbmcgbXl0aGluZz0gImhlcmUgaXQgaXMiOwogcHVibGljOgogZnJpZW5kIFQmIFQ6Om9wZXJhdG9yPShjb25zdCBUJik7IC8vV29ya3MgZmluZSwgbm8gZXJyb3IKIGZyaWVuZCBUJjo6VChjb25zdCBUJik7IC8vZXJyb3I6IHByb3RvdHlwZSBmb3IgJ0JlTXlGcmllbmQ6OkJlTXlGcmllbmQoY29uc3QgQmVNeUZyaWVuZCYpJyBkb2VzIG5vdCBtYXRjaCBhbnkgaW4gY2xhc3MgJ0JlTXlGcmllbmQnCiB0ZW1wbGF0ZTxjbGFzcyBEPVQ+CiBmcmllbmQgaW50IFQ6OmNoZWNrcHJpdmFjeShjb25zdCBUZXN0PEQ+KTsKCQp9OwoKCgoKCmludCBtYWluKCkKewogQmVNeUZyaWVuZCB5b3VyZnJpZW5kOwogVGVzdDxCZU15RnJpZW5kPiBobW07CiB5b3VyZnJpZW5kLmNoZWNrcHJpdmFjeShobW0pOwogCiByZXR1cm4gMDsKfQo=