namespace MyNamespace
{
template <typename Type>
class Container;
namespace AccessPrivateImplementation
{
template <typename Type>
Type getValue(Container<Type>* container);
}
template <typename Type>
class Container
{
friend Type AccessPrivateImplementation::getValue<>(Container<Type>* volume);
private:
Type value;
};
namespace AccessPrivateImplementation
{
template <typename Type>
Type getValue(Container<Type>* container)
{
return container->value;
}
}
}
int main(int argc, char* argv[])
{
MyNamespace::Container<int> cont;
MyNamespace::AccessPrivateImplementation::getValue(&cont);
return 0;
}
bmFtZXNwYWNlIE15TmFtZXNwYWNlCnsKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgogICAgY2xhc3MgQ29udGFpbmVyOwoKICAgIG5hbWVzcGFjZSBBY2Nlc3NQcml2YXRlSW1wbGVtZW50YXRpb24KICAgIHsKICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KICAgICAgICBUeXBlIGdldFZhbHVlKENvbnRhaW5lcjxUeXBlPiogY29udGFpbmVyKTsKICAgIH0KCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KICAgIGNsYXNzIENvbnRhaW5lcgogICAgewogICAgICAgIGZyaWVuZCBUeXBlIEFjY2Vzc1ByaXZhdGVJbXBsZW1lbnRhdGlvbjo6Z2V0VmFsdWU8PihDb250YWluZXI8VHlwZT4qIHZvbHVtZSk7CiAgICBwcml2YXRlOgogICAgICAgIFR5cGUgdmFsdWU7CiAgICB9OwoKICAgIG5hbWVzcGFjZSBBY2Nlc3NQcml2YXRlSW1wbGVtZW50YXRpb24KICAgIHsKICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KICAgICAgICBUeXBlIGdldFZhbHVlKENvbnRhaW5lcjxUeXBlPiogY29udGFpbmVyKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci0+dmFsdWU7CiAgICAgICAgfQogICAgfQp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQp7CiAgICBNeU5hbWVzcGFjZTo6Q29udGFpbmVyPGludD4gY29udDsKICAgIE15TmFtZXNwYWNlOjpBY2Nlc3NQcml2YXRlSW1wbGVtZW50YXRpb246OmdldFZhbHVlKCZjb250KTsKICAgIHJldHVybiAwOwp9Cg==