gcc 3.3.1 compiling - object required

K

ken

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 * >(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
 
V

Victor Bazarov

ken said:
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:


- 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
 
K

ken

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
 
K

ken

Correct. It creates aliases for the names in 'using' declarations.
Those aliases are in 'public' area, so they are public for 'List'.


It depends on what difference you thought it would make.


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.
 
V

Victor Bazarov

ken said:
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
 
K

ken

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

I have raised this as a bug with gcc. Thanks for your patience.
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,014
Latest member
BiancaFix3

Latest Threads

Top