Issue with pointer redirection in inherited clauses
Brian Budge
brian.budge@gmail.com
Wed May 6 02:43:00 GMT 2009
Hi Tyler --
Try putting your using clauses inside the class instead of inside the function.
template <typename T>
class SelfOrganizingList: public list<T>
{
typedef list<T> super;
using super::begin;
using super::end;
...
Brian
On Tue, May 5, 2009 at 7:30 PM, Tyler Earman <rem.intellegare@gmail.com> wrote:
> Hmm that's good advice. I can't seem to get it to compile though.
> Here's the original set of code
> template <typename T>
> class SelfOrganizingList: public list<T>
> {
> public:
> bool contains(const T& t)
> {
> typename list<T>::iterator it = find(this->begin(), this->end(), t);
> if (it == this->end()) return false;
> if (it != this->begin())
> { erase(it);
> push_front(t);
> }
> return true;
> }
> };
>
> Using your advice, I changed the typename list code(line 7) to
>
> typedef list<T> super;
> using super::size;
> using super::empty;
> typedef typename super::iterator it;
>
> However it says that super is not a namespace (strlist.cpp:14: error:
> ‘SelfOrganizingList<T>::contains(const T&)::super’ is not a namespace)
>
> Any advice regarding this issue?
>
> I'm basically looking for a more elegant way of implementing this other
> than using this->begin(); because that seems a bit contradictory to the
> actual reason for the existence of the -> object.
>
> Thanks guys,
> Tyler
>
> John Fine wrote:
>> Tyler Earman wrote:
>>> "I have noticed that when (this is C++) inheriting a templatized derived
>>> class from a templatized base that in g++, references to elements of the
>>> base class have to be qualified with this-> or with the name of the base
>>> class put in front. But this is NOT needed in the Windows C++ compilers
>>> so far as I can see.
>> GCC is doing the correct thing according to the C++ standard. I
>> personally think the C++ standard is bad and this feature makes C++ a
>> worse language than it was before compilers enforced this language
>> behavior.
>>
>> When coding to work around this problem, I find both this->name and
>> base_class::name are ugly constructs. I don't use either to work
>> around this problem. Instead I use using directives, such as:
>>
>> template <class X>
>> class my_container : public std::vector<X>
>> {
>> typedef std::vector<X> super;
>> using super::size;
>> using super::empty;
>> typedef typename super::iterator iterator;
>>
>> At the start of most classes, I typedef the major base class as
>> "super" (not directly relevant to the current issue, but it helps).
>> Then I have the appropriate using super:: declarations to identify all
>> the function and variable names from that super class which will be
>> used bare in the current class. You can't use using declarations for
>> types from the base class, so those are best done with the typedef
>> typename construct.
>>
>>
>>
>
More information about the Gcc-help
mailing list