I'm having some trouble overloading methods in C++. As an example of the problem, I have a class with a number of methods being overloaded, and each method having one parameter with a different data type. My question: is there a particular order in the class these methods should appear in, to make sure the correct method is called depending on its parameters data type?
class SomeClass{
public:
...
void Method(bool paramater);
void Method(std::string paramater);
void Method(uint64_t paramater);
void Method(int64_t paramater);
void Method(uint8_t paramater);
void Method(int8_t paramater);
void Method(float paramater);
void Method(double paramater);
void Method(ClassXYZ paramater);
}
I noticed there was problem because when running:
Method("string");
it was calling:
Method(bool paramater);
The string literal
"string"
has typeconst char[]
which can be implicity converted tobool
. This is the best conversion candidate to one of your overloaded functions although it's not likely to be the most useful one.If your intention was to have string literals be handled by the overload taking a
std::string
, then you need to add an overload taking aconst char*
and make the implementation call thestd::string
version.Not answering your question but, just out of curiosity, is there a hidden reason for not using a template method instead of defining an overload version for each type?
The order makes no difference. The method to call is selected by analyzing the types of arguments and matching them to the types of parameters. In case there's no exact match, the best-matching method is selected. In your case it happens to be the
bool
method.You are supplying an argument of type
const char[7]
. According to the C++ overloading rules, the best path here is to letconst char[7]
decay toconst char *
and then convert it tobool
using a standard conversion. The path with converting tostd::string
is considered worse, since it would involve a user-defined conversion fromconst char *
tostd::string
. Generally, user-defined conversions lose overload resolution process to standard conversions. This is what happens in your case as well.If you need
std::string
version to be called here, provide an explicit overload forconst char *
type, and delegate the call tostd::string
version by converting the argument tostd::string
type explicitlyThe order is of no importance. The problem here is that when you invoke
you are passing a const char[]. This will be converted to bool implicitly. What you want to do is pass an std::string explicitly:
You can add an explict keyword so as to take the intended argument.
As Charles already pointed out, this happens due to an unwanted implicit conversion. If you want to avoid that, use a std::string constructor:
Method(std::string("string"));
or cast it to std::string:However, the order of your declarations isn't important. Also check your spelling of the word "parameter" ;)