[Bug c++/23755] template class inheritance
pinskia at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Tue Sep 6 20:42:00 GMT 2005
------- Additional Comments From pinskia at gcc dot gnu dot org 2005-09-06 20:42 -------
Read http://gcc.gnu.org/gcc-3.4/changes.html:
In a template definition, unqualified names will no longer find members of a dependent base (as
specified by [temp.dep]/3 in the C++ standard). For example,
template <typename T> struct B {
int m;
int n;
int f ();
int g ();
};
int n;
int g ();
template <typename T> struct C : B<T> {
void h ()
{
m = 0; // error
f (); // error
n = 0; // ::n is modified
g (); // ::g is called
}
};
You must make the names dependent, e.g. by prefixing them with this->. Here is the corrected
definition of C<T>::h,
template <typename T> void C<T>::h ()
{
this->m = 0;
this->f ();
this->n = 0
this->g ();
}
As an alternative solution (unfortunately not backwards compatible with GCC 3.3), you may use using
declarations instead of this->:
template <typename T> struct C : B<T> {
using B<T>::m;
using B<T>::f;
using B<T>::n;
using B<T>::g;
void h ()
{
m = 0;
f ();
n = 0;
g ();
}
};
In templates, all non-dependent names are now looked up and bound at definition time (while parsing
the code), instead of later when the template is instantiated. For instance:
void foo(int);
template <int> struct A {
static void bar(void){
foo('a');
}
};
void foo(char);
int main()
{
A<0>::bar(); // Calls foo(int), used to call foo(char).
}
--
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |RESOLVED
Resolution| |INVALID
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23755
More information about the Gcc-bugs
mailing list