Bug 21484

Summary: [g++] using typename doesn't work in case template : template inheritance
Product: gcc Reporter: Kirill Smelkov <smelkov>
Component: c++Assignee: Not yet assigned to anyone <unassigned>
Status: RESOLVED DUPLICATE    
Severity: normal CC: gcc-bugs
Priority: P2 Keywords: rejects-valid
Version: 4.0.0   
Target Milestone: ---   
Host: i686-pc-linux-gnu Target: i686-pc-linux-gnu
Build: i686-pc-linux-gnu Known to work:
Known to fail: 2.95.3 3.0.4 3.2.3 3.3.3 3.4.0 4.0.0 4.1.0 Last reconfirmed: 2005-05-10 16:35:14

Description Kirill Smelkov 2005-05-10 08:26:32 UTC
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
Comment 1 Andrew Pinski 2005-05-10 16:35:14 UTC
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.
Comment 2 Andrew Pinski 2005-05-10 17:42:08 UTC
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 ***
Comment 3 Kirill Smelkov 2005-05-11 05:09:13 UTC
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/