我有一些麻烦重载在C ++中的方法。 作为该问题的一个例子,我有过载与一些方法的类,并具有不同的数据类型的一个参数的每个方法。 我的问题:有没有在类特定的顺序这些方法应该出现在,以确保根据其参数的数据类型选择正确的方法被调用?
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);
}
我注意到运行的时候,因为有问题:
Method("string");
它在呼唤:
Method(bool paramater);
该命令没有什么区别。 通过分析类型的参数,并将它们匹配到类型的参数选择要调用的方法。 如果没有精确匹配,选择最匹配的方法。 在你的情况下,它碰巧是bool
方法。
您正在供给类型的参数const char[7]
根据C ++重载规则,在这里的最佳路径是让const char[7]
衰减到const char *
和然后将其转换到bool
使用标准转换。 与转换为路径std::string
被认为是糟糕的,因为这将涉及从用户定义类型转换const char *
到std::string
。 一般情况下,用户定义的转换失去重载解析过程中的标准转换。 这是你的情况下发生的事情为好。
如果你需要std::string
版本在这里呼吁,提供了一个明确的过载const char *
类型,并委托调用std::string
通过转换参数版本std::string
类型明确
void Method(const char *paramater /* sic! */)
{
Method(std::string(paramater));
}
字符串文字"string"
具有类型const char[]
可以是含蓄转换成bool
。 这是最好的转换候选,以你的重载函数之一,虽然它不太可能是最有用的一个。
如果你的目的是让字符串字面量由过载采取了处理std::string
,那么你需要添加一个过载走const char*
,使执行调用std::string
版本。
顺序并不重要。 这里的问题是,当你调用
Method("string");
您正在传递一个const char []。 这将被转换为隐式bool的。 你想要做的是明确地传递一个的std :: string:
Method( std::string("string"));
不回答你的问题,但是,只是出于好奇,是有一个隐藏的理由不使用模板的方法,而不是定义为每种类型的重载版本?
class SomeClass
{
public:
...
template <typename T>
void Method(T paramater);
};
正如查尔斯已经指出,出现这种情况是由于不想要的隐式转换。 如果你想避免这种情况,使用的std :: string构造函数: Method(std::string("string"));
或铸造它的std :: string:
Method(static_cast<std::string>("string"));
然而,您声明的顺序并不重要。 另外,请检查你的单词“参数”的拼法)
除了字符串的问题,还有一个又一个。 和的int64_t中int8_t(通常)的typedef。 由于类型定义只是别名,它们可能指的是同一类型,其中超载的情况下将无法正常工作。 但是,这是你的情况相当不可能的。 只是想提到它。