This is the PR24163 case mentioned in http://article.gmane.org/gmane.linux.redhat.fedora.devel/157671 --- config.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/config.h b/config.h index 7825364..b0233a9 100644 --- a/config.h +++ b/config.h @@ -122,7 +122,7 @@ public: if (!isempty(s)) { T *l = new T; if (l->Parse(s)) - Add(l); + this->Add(l); else { esyslog("ERROR: error in %s, line %d", fileName, line); delete l;
Am 04.01.2012 21:04, schrieb Ville Skyttä:
This is the PR24163 case mentioned in http://article.gmane.org/gmane.linux.redhat.fedora.devel/157671
diff --git a/config.h b/config.h index 7825364..b0233a9 100644 --- a/config.h +++ b/config.h @@ -122,7 +122,7 @@ public: if (!isempty(s)) { T *l = new T; if (l->Parse(s))
Add(l);
this->Add(l); else { esyslog("ERROR: error in %s, line %d", fileName, line); delete l;
This is one of the cases where it seems appropriate to have a lawyer for every C++ coder, just in case he needs to wrangle the standard...
For info, the above references 14.6.2/3 of the ISO C++ standard, which is:
In the definition of a class template or a member of a class template, if a base class of the class template depends on a template-parameter, the base class scope is not examined during unqualified name lookup either at the point of definition of the class template or member or during an instantiation of the class tem- plate or member. [Example: typedef double A; template<class T> class B { typedef int A; }; template<class T> struct X : B<T> { A a; // a has type double }; The type name A in the definition of X<T> binds to the typedef name defined in the global namespace scope, not to the typedef name defined in the base class B<T>. ]
In our case, I'm not sure if another solution would be to pull in the Add() method manually, by adding an using cList<T>::Add; to the class definition.
There's a similar use of this->First() in Save() that already requires the this-> in current compilers, and it can also be resolved by an using cList<T>::First; .
Cheers,
Udo