Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   gcc 3.3.1 compiling - object required (http://www.velocityreviews.com/forums/t275937-gcc-3-3-1-compiling-object-required.html)

ken 07-22-2003 10:13 PM

gcc 3.3.1 compiling - object required
 

IN the new gcc 3.3.1 I am getting messages like these:

/data2/office/tools/bootstrp/sstring.cxx:105: error: cannot call
member function `ULONG Container::Count() const' without object

Where the Count is defined like this in the class:

using Container::Count;

So far I have worked around this by creating a member function. The
latest one was a bit above me but I ended up changing the code from:

< delete static_cast< INetContentTypeParameter * >(Remove(Count() - 1));
---
> delete static_cast< INetContentTypeParameter * >(this->Remove(Count()

- 1));

This just does not make sense to me, surely the compiler should work out
that this is there. In full:

void INetContentTypeParameterList::Clear()
{
while (Count() > 0)
delete static_cast< INetContentTypeParameter * >(this->Remove(Count() - 1));
}

Is this a compiler bug or a stronger enforcement of some standard?

KenF



Victor Bazarov 07-22-2003 10:21 PM

Re: gcc 3.3.1 compiling - object required
 
"ken" <ken@gandalf.foskey.org> wrote...
>
> IN the new gcc 3.3.1 I am getting messages like these:
>
> /data2/office/tools/bootstrp/sstring.cxx:105: error: cannot call
> member function `ULONG Container::Count() const' without object
>
> Where the Count is defined like this in the class:
>
> using Container::Count;


In which class? Does it inherit from 'Container'?

> So far I have worked around this by creating a member function. The
> latest one was a bit above me but I ended up changing the code from:
>
> < delete static_cast< INetContentTypeParameter * >(Remove(Count() - 1));
> ---
> > delete static_cast< INetContentTypeParameter * >(this->Remove(Count()

> - 1));


Whose member function is "Remove"?

>
> This just does not make sense to me, surely the compiler should work out
> that this is there. In full:
>
> void INetContentTypeParameterList::Clear()
> {
> while (Count() > 0)
> delete static_cast< INetContentTypeParameter * >(this->Remove(Count() -

1));
> }
>
> Is this a compiler bug or a stronger enforcement of some standard?


Post more code. Preferably, in compilable form.

Victor



ken 07-23-2003 12:25 PM

Re: gcc 3.3.1 compiling - object required
 


OK now I can actually see something that might be the problem, the class I
am using is derived from List

class List : private Container
{
public:
using Container::Insert;
using Container::Replace;
using Container::Clear;
using Container::GetCurObject;
using Container::GetCurPos;
using Container::GetObject;
using Container::GetPos;
using Container::Seek;
using Container::First;
using Container::Last;
using Container::Next;
using Container::Prev;
using Container::Remove;

So the Remove is declare private by inheritance above but the using
statement is supposed to override the private to public. I added the
"using" clause at someones suggestion but it did not make any difference,
with or without the using clause.

The actual class where it is trying to be used we are seeing:

class INetContentTypeParameterList: private List

So if it is using inheritance then it should fail, but the using clause
should make that specific routine public. Is this right or wrong?

Thanks
KenF

ken 07-23-2003 02:01 PM

Re: gcc 3.3.1 compiling - object required
 
On Wed, 23 Jul 2003 09:33:24 -0400, Victor Bazarov wrote:

> "ken" <ken@gandalf.foskey.org> wrote...
>>
>>
>> OK now I can actually see something that might be the problem, the class I
>> am using is derived from List
>>
>> class List : private Container
>> {
>> public:
>> using Container::Insert;
>> using Container::Replace;
>> using Container::Clear;
>> using Container::GetCurObject;
>> using Container::GetCurPos;
>> using Container::GetObject;
>> using Container::GetPos;
>> using Container::Seek;
>> using Container::First;
>> using Container::Last;
>> using Container::Next;
>> using Container::Prev;
>> using Container::Remove;
>>
>> So the Remove is declare private by inheritance above but the using
>> statement is supposed to override the private to public.

>
> Correct. It creates aliases for the names in 'using' declarations.
> Those aliases are in 'public' area, so they are public for 'List'.
>
>> I added the
>> "using" clause at someones suggestion but it did not make any difference,
>> with or without the using clause.

>
> It depends on what difference you thought it would make.
>
>>
>> The actual class where it is trying to be used we are seeing:
>>
>> class INetContentTypeParameterList: private List
>>
>> So if it is using inheritance then it should fail, but the using clause
>> should make that specific routine public. Is this right or wrong?

>
> Is what right or wront? 'List' is a private base class of 'INet...List'.
> All its members, including the aliases you added to 'List' with 'using'
> declarations, are private to the outside of 'INet...List'. However,
> they should be visible (accessible) in the members of 'INet...List' class.
>
> Example:
>
> class Bottom {
> public:
> void foo();
> protected:
> void bar();
> };
>
> class Middle : private Bottom {
> public:
> using Bottom::bar(); // 'Middle::bar' is public
> };
>
> class Top : private Middle {
> void member();
> };
>
> void Top::member() {
> bar(); // this is OK -- Middle::bar is accessible here
> }
>
> int main() {
> Top top;
> top.bar(); // error -- anything from Middle is private
> // if accessed through Top object
>
> Middle middle;
> middle.bar(); // OK -- Middle::bar is public
> }
>
> Victor


So going back to my original code:

void INetContentTypeParameterList::Clear()
{
while (Count() > 0)
delete static_cast< INetContentTypeParameter * >(this->Remove(Count() - 1));
}


The Remove call is public from list which is in turn inherited as private
intoINetContentTypeParameterList so any routine within
INetContentTypeParameterList should be able to use Remove without any conflict.

So in this case should the compiler find the inheritance of Remove from
list and not need the explicit "this->" pointer? If I remove "this->" the
compiler is giving:

/data2/office/tools/source/fsys/dirent.cxx:347: error: cannot call member
function `??? Container::Remove()' without object

Is this a bug with gcc 3.3.1 or something else?

Ta
KenF

PS: Does anyone have a web link on the using clause searching for a
common word such as using does not work very well.

Victor Bazarov 07-23-2003 02:14 PM

Re: gcc 3.3.1 compiling - object required
 
"ken" <ken@gandalf.foskey.org> wrote...
> On Wed, 23 Jul 2003 09:33:24 -0400, Victor Bazarov wrote:
>
> > "ken" <ken@gandalf.foskey.org> wrote...
> >>
> >>
> >> OK now I can actually see something that might be the problem, the

class I
> >> am using is derived from List
> >>
> >> class List : private Container
> >> {
> >> public:
> >> using Container::Insert;
> >> using Container::Replace;
> >> using Container::Clear;
> >> using Container::GetCurObject;
> >> using Container::GetCurPos;
> >> using Container::GetObject;
> >> using Container::GetPos;
> >> using Container::Seek;
> >> using Container::First;
> >> using Container::Last;
> >> using Container::Next;
> >> using Container::Prev;
> >> using Container::Remove;
> >>
> >> So the Remove is declare private by inheritance above but the using
> >> statement is supposed to override the private to public.

> >
> > Correct. It creates aliases for the names in 'using' declarations.
> > Those aliases are in 'public' area, so they are public for 'List'.
> >
> >> I added the
> >> "using" clause at someones suggestion but it did not make any

difference,
> >> with or without the using clause.

> >
> > It depends on what difference you thought it would make.
> >
> >>
> >> The actual class where it is trying to be used we are seeing:
> >>
> >> class INetContentTypeParameterList: private List
> >>
> >> So if it is using inheritance then it should fail, but the using

clause
> >> should make that specific routine public. Is this right or wrong?

> >
> > Is what right or wront? 'List' is a private base class of

'INet...List'.
> > All its members, including the aliases you added to 'List' with 'using'
> > declarations, are private to the outside of 'INet...List'. However,
> > they should be visible (accessible) in the members of 'INet...List'

class.
> >
> > Example:
> >
> > class Bottom {
> > public:
> > void foo();
> > protected:
> > void bar();
> > };
> >
> > class Middle : private Bottom {
> > public:
> > using Bottom::bar(); // 'Middle::bar' is public
> > };
> >
> > class Top : private Middle {
> > void member();
> > };
> >
> > void Top::member() {
> > bar(); // this is OK -- Middle::bar is accessible here
> > }
> >
> > int main() {
> > Top top;
> > top.bar(); // error -- anything from Middle is private
> > // if accessed through Top object
> >
> > Middle middle;
> > middle.bar(); // OK -- Middle::bar is public
> > }
> >
> > Victor

>
> So going back to my original code:
>
> void INetContentTypeParameterList::Clear()
> {
> while (Count() > 0)
> delete static_cast< INetContentTypeParameter * >(this->Remove(Count() -

1));
> }
>
>
> The Remove call is public from list which is in turn inherited as private
> intoINetContentTypeParameterList so any routine within
> INetContentTypeParameterList should be able to use Remove without any

conflict.
>
> So in this case should the compiler find the inheritance of Remove from
> list and not need the explicit "this->" pointer? If I remove "this->" the
> compiler is giving:
>
> /data2/office/tools/source/fsys/dirent.cxx:347: error: cannot call member
> function `??? Container::Remove()' without object
>
> Is this a bug with gcc 3.3.1 or something else?


I think it's a bug in gcc. Similar code:

class Contained {};

class Container {
public:
int Count();
void* Remove(int);
};

class List : private Container {
public:
using Container::Count;
using Container::Remove;
};

class INetContentTypeParameterList : private List {
public:
void Clear();
};

void INetContentTypeParameterList::Clear() {
while (Count())
delete static_cast<Contained*>(Remove(Count() - 1));
}

int main() {
INetContentTypeParameterList ilist;
ilist.Clear();
}

compiles fine with, for example, Comeau and even Visual C++ v6.

>
> Ta
> KenF
>
> PS: Does anyone have a web link on the using clause searching for a
> common word such as using does not work very well.


What do you mean? I searched Google for "using declaration" (yes,
in quotes), and got plenty of C++ links.

Victor



ken 07-23-2003 02:35 PM

Re: gcc 3.3.1 compiling - object required
 
On Wed, 23 Jul 2003 10:14:59 -0400, Victor Bazarov wrote:

> compiles fine with, for example, Comeau and even Visual C++ v6.


I have raised this as a bug with gcc. Thanks for your patience.

>> PS: Does anyone have a web link on the using clause searching for a
>> common word such as using does not work very well.

>
> What do you mean? I searched Google for "using declaration" (yes,
> in quotes), and got plenty of C++ links.


It is all in the words :-)

KenF


All times are GMT. The time now is 01:24 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.