我有以下界面
virtual void send_command( const std::string& command, const std::string& key, const std::string& value, bool pipeline = true );
virtual void send_command( const std::string& command, const std::string& key, bool pipeline = true );
virtual void send_command( const std::string& command, bool pipeline = true );
在一个类中完全实现,然后我将调用如下:
c.send_command("MUTLI");
c.send_command("SET", "foo", "bar");
c.send_command("GET", "foo");
c.send_command("EXEC");
当我检查调用哪个方法实现时,我看到第三个调用( GET foo )最终命中了最后一个实现:
virtual void send_command( const std::string& command, bool pipeline = true );
其中“foo”隐式转换为bool。 “SET”,“foo”,“bar”的计数与第二个实现相同(字符串,字符串,bool) 当我使用显式c-cast进行调用时,将其转换为类似
的字符串c.send_command("GET", (std::string)"foo");
调用预期的方法。
我正在使用gcc(GCC)4.7.2 20121109(Red Hat 4.7.2-8)和C ++ 11。
答案 0 :(得分:4)
编译器倾向于通过转换为UDT(const char*
)从bool
转换为std::string
。如果需要,也可以为const char*
添加更多重载。
答案 1 :(得分:4)
你正在发现这样一个事实:指针可以隐式地转换为bool
(测试它们不是null),并且字符串文字不是std::string
,而是{{1在电话中衰减为const char[]
。您可以做的是提供额外的重载const char*
:
const char*
答案 2 :(得分:1)
过载分辨率有几个步骤:首先,选择一组可行的功能。考虑省略号和/或默认参数,这些可行的函数必须具有足够的调用参数。此外,每个参数都必须可转换为相应的参数类型。对于c.send_command("GET", "foo");
,你有可行的候选人
virtual void send_command( const std::string&, const std::string&, bool);
virtual void send_command( const std::string&, bool);
因为前者的第三个参数是默认的,字符串文字参数可以转换为string const&
和bool
。
在具有可行集之后,编译器会查看所需的参数转换。不需要转换,然后是内置转换,然后是用户定义的转换。在这种情况下,第一个参数的转换在两个可行的函数中都是相同的。对于第二个参数,转换为bool
是buitlin,而转换为string const&
则不是。因此,send_command( const std::string&, bool);
优先于替代方案。