// regardless of the fact that members are exposed...
template < typename T>
struct TBase {
typedef T MemberType;
MemberType baseMember;
MemberType baseFunction( ) { return MemberType( ) ; }
} ;
template < typename T>
struct TDerived : public TBase< T> {
// http://w...content-available-to-author-only...t.com/c++-faq-lite/nondependent-name-lookup-members.html
// tells us to use a `using` declaration.
using typename TBase< T> :: MemberType ;
using TBase< T> :: baseFunction ;
using TBase< T> :: baseMember ;
void useBaseFunction( ) {
// what I want to be able to write:
baseFunction( ) ;
++ baseMember;
MemberType t; // error: expected primary-expression
}
} ;
int main( ) {
TDerived< int > d;
d.useBaseFunction ( ) ;
}
Ci8vIHJlZ2FyZGxlc3Mgb2YgdGhlIGZhY3QgdGhhdCBtZW1iZXJzIGFyZSBleHBvc2VkLi4uCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCBUQmFzZSB7CiAgIHR5cGVkZWYgVCBNZW1iZXJUeXBlOwogICBNZW1iZXJUeXBlIGJhc2VNZW1iZXI7CiAgIE1lbWJlclR5cGUgYmFzZUZ1bmN0aW9uKCkgeyByZXR1cm4gTWVtYmVyVHlwZSgpOyB9Cn07CgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IFREZXJpdmVkIDogcHVibGljIFRCYXNlPFQ+IHsKICAgLy8gaHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnQuY29tL2MrKy1mYXEtbGl0ZS9ub25kZXBlbmRlbnQtbmFtZS1sb29rdXAtbWVtYmVycy5odG1sCiAgIC8vIHRlbGxzIHVzIHRvIHVzZSBhIGB1c2luZ2AgZGVjbGFyYXRpb24uCiAgIHVzaW5nIHR5cGVuYW1lIFRCYXNlPFQ+OjpNZW1iZXJUeXBlOwogICB1c2luZyBUQmFzZTxUPjo6YmFzZUZ1bmN0aW9uOwogICB1c2luZyBUQmFzZTxUPjo6YmFzZU1lbWJlcjsKICAgIAogICAgICAgdm9pZCB1c2VCYXNlRnVuY3Rpb24oKSB7IAogICAgICAgICAgLy8gd2hhdCBJIHdhbnQgdG8gYmUgYWJsZSB0byB3cml0ZToKICAgICAgICAgIGJhc2VGdW5jdGlvbigpOwogICAgICAgICAgKytiYXNlTWVtYmVyOwogICAgICAgICAgTWVtYmVyVHlwZSB0OyAvLyBlcnJvcjogZXhwZWN0ZWQgcHJpbWFyeS1leHByZXNzaW9uCiAgICAgICB9Cn07CgoKaW50IG1haW4oKXsgCiAgVERlcml2ZWQ8aW50PiBkOwogIGQudXNlQmFzZUZ1bmN0aW9uKCk7Cn0=