#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( ) { } ;
} ;
class Imnotyourfriend
{
public :
template < class T>
int checkprivacy( const Test< T> areyoumyfriend) {
areyoumyfriend.mything ;
} ;
Imnotyourfriend( ) { std:: cout << "works " << std:: endl ; } ;
} ;
template < class T>
class Test
{
private :
string mything= "here it is" ;
public :
friend T& T:: operator = ( const T& ) ;
friend BeMyFriend& :: BeMyFriend ( const BeMyFriend& ) ;
friend T& :: T ( const T& ) ;
template < class D= T>
friend int T:: checkprivacy ( const Test< D> ) ;
} ;
int main( )
{
Test< BeMyFriend> hmm;
Imnotyourfriend wannabefriend;
wannabefriend.checkprivacy ( hmm) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8Y2xhc3MgVD4KY2xhc3MgVGVzdDsKCiAKY2xhc3MgQmVNeUZyaWVuZAp7CnB1YmxpYzoKdGVtcGxhdGU8Y2xhc3MgVD4gCmludCBjaGVja3ByaXZhY3koY29uc3QgVGVzdDxUPiBhcmV5b3VteWZyaWVuZCkKewkKCXN0ZDo6Y291dCA8PCAibGVtbWUgY2hlY2sgIiA8PCBhcmV5b3VteWZyaWVuZC5teXRoaW5nIDw8IHN0ZDo6ZW5kbDsKCQp9OwpCZU15RnJpZW5kJiBvcGVyYXRvcj0oY29uc3QgQmVNeUZyaWVuZCYgKTsKQmVNeUZyaWVuZCgpe307Cn07CmNsYXNzIEltbm90eW91cmZyaWVuZCAKewpwdWJsaWM6CnRlbXBsYXRlPGNsYXNzIFQ+IAppbnQgY2hlY2twcml2YWN5KGNvbnN0IFRlc3Q8VD4gYXJleW91bXlmcmllbmQpewoJYXJleW91bXlmcmllbmQubXl0aGluZzsKfTsKSW1ub3R5b3VyZnJpZW5kKCl7c3RkOjpjb3V0IDw8ICJ3b3JrcyAiIDw8IHN0ZDo6ZW5kbDt9Owp9OwoKdGVtcGxhdGU8Y2xhc3MgVD4KY2xhc3MgVGVzdAp7CiBwcml2YXRlOgogc3RyaW5nIG15dGhpbmc9ICJoZXJlIGl0IGlzIjsKIHB1YmxpYzoKIGZyaWVuZCBUJiBUOjpvcGVyYXRvcj0oY29uc3QgVCYpOyAKIGZyaWVuZCBCZU15RnJpZW5kJjo6QmVNeUZyaWVuZChjb25zdCBCZU15RnJpZW5kJik7IAogZnJpZW5kIFQmOjpUKGNvbnN0IFQmKTsgCiB0ZW1wbGF0ZTxjbGFzcyBEPVQ+CiBmcmllbmQgaW50IFQ6OmNoZWNrcHJpdmFjeShjb25zdCBUZXN0PEQ+KTsKCQp9OwoKCgoKCmludCBtYWluKCkKewogVGVzdDxCZU15RnJpZW5kPiBobW07CiBJbW5vdHlvdXJmcmllbmQgd2FubmFiZWZyaWVuZDsKIHdhbm5hYmVmcmllbmQuY2hlY2twcml2YWN5KGhtbSk7CiAKIHJldHVybiAwOwp9Cg==
compilation info
prog.cpp:38:23: warning: friend declaration ‘T& T(const T&)’ declares a non-template function [-Wnon-template-friend]
friend T&::T(const T&);
^
prog.cpp:38:23: note: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here)
prog.cpp: In instantiation of ‘int Imnotyourfriend::checkprivacy(Test<T>) [with T = BeMyFriend]’:
prog.cpp:52:32: required from here
prog.cpp:25:17: error: ‘std::__cxx11::string Test<BeMyFriend>::mything’ is private within this context
areyoumyfriend.mything;
~~~~~~~~~~~~~~~^~~~~~~
prog.cpp:34:18: note: declared private here
string mything= "here it is";
^~~~~~~~~~~~
stdout