In visual C++, I can do things like this:
template <class T>
class A{
protected:
T i;
};
template <class T>
class B : public A<T>{
T geti() {return i;}
};
If I try to compile this in g++, I get an error. I have to do this:
template <class T>
class B : public A<T>{
T geti() {return A<T>::i;}
};
Am I not supposed to do the former in standard C++? Or is something misconfigured with gcc that's giving me errors?
This used to be allowed, but changed in gcc 3.4.
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::h,
template <typename T> void C<T>::h ()
{
this->m = 0;
this->f ();
this->n = 0
this->g ();
}
I figured this one out:
Apparently, the first example ISN'T valid C++ and it's bad that msvc takes this. There are solutions posted on the C++ faq lite.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With