Summary: | Beats me | ||
---|---|---|---|
Product: | gcc | Reporter: | Ivan Godard <igodard> |
Component: | c++ | Assignee: | Not yet assigned to anyone <unassigned> |
Status: | RESOLVED DUPLICATE | ||
Severity: | normal | CC: | gashlerm, gcc-bugs, igodard, metcalf, vhaisman |
Priority: | P2 | ||
Version: | 3.4.0 | ||
Target Milestone: | --- | ||
Host: | Target: | ||
Build: | Known to work: | ||
Known to fail: | Last reconfirmed: |
Description
Ivan Godard
2005-09-20 08:21:01 UTC
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 (); } }; Oh yeah - I've fallen into (and reported) that one before. How quickly we forget! You know, a "perhaps you meant 'this->foo'?" in the diagnostic ould cut down on the redundant reports you guys get :-) Ivan Reopening to ... |