Overloading mess: No matching function for call

T

tomas

Hi.
I wrote a code similar to this one, for a wrapper application that I
needed:

#include <iostream>

using namespace std;

class Client
{
public:
void setEndpoint(const string& s) throw() { a_endpoint = s;
setEndpoint(); }

protected:
virtual void setEndpoint() throw() = 0;

string a_endpoint;
};

class NotifyClient : public Client
{
public:
const char* endpoint;

private:
void setEndpoint() throw() { endpoint = a_endpoint.c_str(); }
};


int main()
{
NotifyClient client;
string url("http://www.google.com");
client.setEndpoint( url );

return 0;
}


But I'm getting this compile error with g++:

inheritanceTopic.cc:30: error: no matching function for call to
`NotifyClient::setEndpoint(std::string&)'
inheritanceTopic.cc:22: note: candidates are: virtual void
NotifyClient::setEndpoint()

If I change the line,

client.setEndpoint( url );

by

client.Client::setEndpoint( url );

it works.

I'm wondering why is it. I guess it has something to do with function
overloading and the compiler, because if I change names, it works too.

Can anyone give me a better explanation?
I would like to use the same name in the functions, but I don't like
the style of:

client.Client::setEndpoint( url );

pretty ugly....

Thanks in advance,
Tomas.
 
S

sasha

Hi.
I wrote a code similar to this one, for a wrapper application that I
needed:

#include <iostream>

using namespace std;

class Client
{
public:
void setEndpoint(const string& s) throw() { a_endpoint = s;
setEndpoint(); }

protected:
virtual void setEndpoint() throw() = 0;

string a_endpoint;

};

class NotifyClient : public Client
{
public:
const char* endpoint;

private:
void setEndpoint() throw() { endpoint = a_endpoint.c_str(); }

};

int main()
{
NotifyClient client;
string url("http://www.google.com");
client.setEndpoint( url );

return 0;

}

But I'm getting this compile error with g++:

inheritanceTopic.cc:30: error: no matching function for call to
`NotifyClient::setEndpoint(std::string&)'
inheritanceTopic.cc:22: note: candidates are: virtual void
NotifyClient::setEndpoint()

If I change the line,

client.setEndpoint( url );

by

client.Client::setEndpoint( url );

it works.

I'm wondering why is it. I guess it has something to do with function
overloading and the compiler, because if I change names, it works too.

Can anyone give me a better explanation?
I would like to use the same name in the functions, but I don't like
the style of:

client.Client::setEndpoint( url );

pretty ugly....

Thanks in advance,
Tomas.

void setEndpoint() in the NotifyClient class is private and in the
Client is protected. You cannot lower the access level of the virtual
function. BTW, visa verse would works.
 
P

puzzlecracker

Hi.
I wrote a code similar to this one, for a wrapper application that I
needed:

#include <iostream>

using namespace std;

class Client
{
public:
void setEndpoint(const string& s) throw() { a_endpoint = s;
setEndpoint(); }

protected:
virtual void setEndpoint() throw() = 0;

string a_endpoint;

};

class NotifyClient : public Client
{
public:
const char* endpoint;

private:
void setEndpoint() throw() { endpoint = a_endpoint.c_str(); }

};

int main()
{
NotifyClient client;
string url("http://www.google.com");
client.setEndpoint( url );

return 0;

}

But I'm getting this compile error with g++:

inheritanceTopic.cc:30: error: no matching function for call to
`NotifyClient::setEndpoint(std::string&)'
inheritanceTopic.cc:22: note: candidates are: virtual void
NotifyClient::setEndpoint()

If I change the line,

client.setEndpoint( url );

by

client.Client::setEndpoint( url );

it works.

I'm wondering why is it. I guess it has something to do with function
overloading and the compiler, because if I change names, it works too.

Can anyone give me a better explanation?
I would like to use the same name in the functions, but I don't like
the style of:

client.Client::setEndpoint( url );

pretty ugly....

Thanks in advance,
Tomas.

void setEndpoint() in the NotifyClient class is private and in the
Client is protected. You cannot lower the access level of the virtual
function. BTW, visa verse would works.
 
L

Lars Tetzlaff

tomas said:
But I'm getting this compile error with g++:

inheritanceTopic.cc:30: error: no matching function for call to
`NotifyClient::setEndpoint(std::string&)'
inheritanceTopic.cc:22: note: candidates are: virtual void
NotifyClient::setEndpoint()


Thanks in advance,
Tomas.

Insert

public:
using Client::setEndpoint;

into class NotifyClient, that makes both functions visible.

Lars
 
J

Jiøí Paleèek

Hi.
I wrote a code similar to this one, for a wrapper application that I
needed:

#include <iostream>

using namespace std;

class Client
{
public:
void setEndpoint(const string& s) throw() { a_endpoint = s;
setEndpoint(); }

protected:
virtual void setEndpoint() throw() = 0;

string a_endpoint;
};

class NotifyClient : public Client
{
public:
const char* endpoint;

private:
void setEndpoint() throw() { endpoint = a_endpoint.c_str(); }
};


int main()
{
NotifyClient client;
string url("http://www.google.com");
client.setEndpoint( url );

return 0;
}


But I'm getting this compile error with g++:

inheritanceTopic.cc:30: error: no matching function for call to
`NotifyClient::setEndpoint(std::string&)'
inheritanceTopic.cc:22: note: candidates are: virtual void
NotifyClient::setEndpoint()

If I change the line,

client.setEndpoint( url );

by

client.Client::setEndpoint( url );

it works.

I'm wondering why is it. I guess it has something to do with function
overloading and the compiler, because if I change names, it works too.

Can anyone give me a better explanation?

This is beacuse you have a NotifyClient class and there is only one
"setEndpoint" function in it - the one with no parameters. The rule is,
any member of a class shadows the members of the same name in its base
classes. There are solutions for this.

1) you can import Client::setEndpoint to NotifyClient via using
declaration. However, this has the caveat that you have to do this for all
derived classes.

2) the simplest and easiest solution is to rename the protected
setEndpoint() to something else - like doSetEndpoint() - and have only
one, public, setEndpoint(string) function in the base class.

Regards
Jiri Palecek
 

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

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,070
Latest member
BiogenixGummies

Latest Threads

Top