已编辑 - 请跳到真正有问题的编辑
我经常在独立函数的字符串帮助程序库中遇到这种情况,我在其中提供函数的重载,其中版本采用 achar
和采用std::string
.
问题是,当传递一个字符串字面量 ( const char*
) 时,重载就会变得模棱两可。
例子:
void myFunc(const std::string &subStr);
void myFunc(char character);
这两个函数的实现方式不同,一个针对字符串进行了优化,一个针对单个字符进行了优化。但是,尽管我一直希望它调用版本,但尝试调用myFunc("literal")
会导致模棱两可。std::string
这迫使我提供void myFunc(const char *str)
我的重载版本,这些版本只是存根,例如:
void myFunc(const char *str)
{
myFunc(std::string(str));
}
有没有办法让这些存根函数变得不必要?我只想能够使void myFunc(char c)
'显式',但你不能使非构造函数非成员函数显式。这将立即解决问题。=(...
(顺便说一句,为什么你不能明确独立的功能?)
编辑: 你知道他们说程序员编码太晚了!(如果你还记得那个笑话,告诉我,因为我最初听到的时候太困了,现在我已经忘记了)
真正的问题
我正在使用 MinGW v4.7.2,问题与我最初假设的问题有很大不同。
问题是,我有几个重载。是的,这个例子工作正常:
void myFunc(const std::string &subStr);
void myFunc(char character);
但是如果你添加一个 std::function 重载,它就会崩溃:
void myFunc(const std::string &subStr);
//Not actually part of the problem; I was confused by part of the error message highlighting this function.
//void myFunc(char character);
void myFunc(std::function<bool(char)); //<-- The real problem
我的字符串库有 std::string、char 和 std::function 重载(偶尔还有一些重载用于简化带有大量可选参数的函数)。
当我将 std::function 作为重载时,我收到以下错误消息:
error: call of overloaded ‘myFunc(const char [15])’ is ambiguous
candidates are:
void myFunc(char) <near match>
no known conversion for argument 1 from ‘const char [15]’ to ‘char’
void myFunc(std::function<bool(char)>)
void myFunc(const string&)
myFunc(char) 是我昨晚最初感到困惑的原因。从代码中删除该重载,我收到错误消息:
error: call of overloaded ‘myFunc(const char [15])’ is ambiguous
candidates are:
void myFunc(std::function<bool(char)>)
void myFunc(const string&)
这是一个独立的可编译示例。
如何使字符串文字选择 std::string 而不是 std::function?这可能是模棱两可的,因为 std::function 的构造函数是模板化的,并且设计用于获取函数指针等。
因为我的字符串库,具体来说,只使用std::function<bool(char)>
and std::function<bool(const std::string&)>
,已经 typedef'd,我可以将它们继承到具有显式构造函数的类中。
是否有其他可用的建议或选项?