Is it just me or what? ===nested_defs.cpp=== template<typename T> struct A { typedef T value_type; }; template<class T> struct B : A<T> { using typename A<T>::value_type; value_type x; }; int main() { B<int> b; b.x = 0; return 0; } === [kirr@tugrik tmp]$ g++ -g -c -Wall nested_defs.cpp nested_defs.cpp:12: error: 'value_type' does not name a type nested_defs.cpp:12: note: (perhaps 'typename A<T>::value_type' was intended) nested_defs.cpp: In function 'int main()': nested_defs.cpp:20: error: 'struct B<int>' has no member named 'x' [kirr@tugrik tmp]$ g++ -v Using built-in specs. Target: i686-pc-linux-gnu Configured with: ../gcc-4.0.0/configure --prefix=/usr/local/gcc-4.0.0--nocheck-native --with-gnu-as --with-gnu-ld --enable-threads=posix --with-arch=pentium3 --with-tune=pentium4 --enable-__cxa_atexit --enable-languages=c,c++,java,f95 --disable-checking --disable-nls Thread model: posix gcc version 4.0.0 With Comeau C++ & Intel 8.0 C++ it is ok. --- By the way, if i want to access all members of A<T> inside B, without explicit using, typedef, etc, what can i do? damn, if B is not template it works === template<typename T> struct A { typedef T value_type; }; struct B : A<int> { value_type x; }; === if A is not template it also works: === struct A { typedef int value_type; }; template<typename T> struct B : A { value_type x; }; === only for template : template case it doesn't compile (g++, Comeau), although intel C++ 8.0 works ok: === template<typename T> struct A { typedef T value_type; }; template<typename T> struct B : A<T> { value_type x; }; int main() { B<int> b; b.x = 0; return 0; } === [kirr@tugrik tmp]$ /opt/intel_cc_80/bin/icc -c nested_defs.cpp [kirr@tugrik tmp]$ echo $? 0
Your first example is valid code. And the second. And the third. But the fourth is invalid code and ICC in strict mode also rejects it. Confirmed, based on the first example, this comes down to using semantics which G++ does not always get right, there might be already a bug about this somewhere.
And I was right, there was a bug about this already, see PR 14258 which I am going to mark this bug as a dup of. *** This bug has been marked as a duplicate of 14258 ***
Excuse me. The following is unconditionally offtopic, but is there a way to use whole base namespace, say something like template<typename T> struct A { ... } template<typename T> struct B : A<T> { using A<T>::* ; or using A<T>::; }; /none of these works, but i think the idea is clear/