Bug 21484 - [g++] using typename doesn't work in case template : template inheritance
Summary: [g++] using typename doesn't work in case template : template inheritance
Status: RESOLVED DUPLICATE of bug 14258
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.0.0
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords: rejects-valid
Depends on:
Blocks:
 
Reported: 2005-05-10 08:26 UTC by Kirill Smelkov
Modified: 2005-05-11 05:09 UTC (History)
1 user (show)

See Also:
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


Attachments

Note You need to log in before you can comment on or make changes to this bug.
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/