C ++函数重载令人困惑的字符串引用和匿名函数

时间:2016-06-22 09:25:54

标签: c++

我为字符串处理定义了以下函数:

void sub(const std::string & repl){
}

void sub(std::function<std::string()> userfun){
}

当我使用匿名函数调用时,没关系

sub([=](){return "a"; });

但是当我用字符串调用时,它失败了

sub("a");
  

错误C2668:'sub':对重载函数的模糊调用

使用字符串对抗匿名函数参数

进行调用时是否可以避免模糊调用

使用Visual C ++ 2013

UPDATE2

创建一个新的控制台项目并将所有内容放在草图中,但在VC ++ 2013中仍然失败

// overload.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <string>
#include <functional>
void sub(const std::string & repl) {
}

void sub(std::function<std::string()> userfun) {

}
int _tmain(int argc, _TCHAR* argv[])
{
    sub("a");
    return 0;
}

1>------ Build started: Project: overload, Configuration: Debug Win32 ------
1>Build started 2016-06-22 17:55:00.
1>InitializeBuildStatus:
1>  Touching "Debug\overload.tlog\unsuccessfulbuild".
1>ClCompile:
1>  overload.cpp
1>c:\users\xxxxxx\documents\visual studio 2013\projects\overload\overload\overload.cpp(15): error C2668: 'sub' : ambiguous call to overloaded function
1>          c:\users\xxxxxx\documents\visual studio 2013\projects\overload\overload\overload.cpp(10): could be 'void sub(std::function<std::string (void)>)'
1>          c:\users\xxxxxx\documents\visual studio 2013\projects\overload\overload\overload.cpp(7): or       'void sub(const std::string &)'
1>          while trying to match the argument list '(const char [2])'
1>
1>Build FAILED.
1>

更新: 我的VS关于信息: enter image description here

1 个答案:

答案 0 :(得分:3)

这是一个编译器错误:notepad.callback(highlight_preprocessor, [NOTIFICATION.FILEBEFORESAVE])是一个适当的解决方法。 (将匿名临时绑定到sub(std::string("a"));引用在C ++中是合法的。)

MSVC2013编译语句

const

显示std::function<std::string()> foo("a"); 是该类型的有效构造函数参数。 (它似乎错误地使用了构造函数"a")。

参考:http://en.cppreference.com/w/cpp/utility/functional/function/function