2016-06-22 2 views
1

I definiert folgende Funktionen zur String-Verarbeitung:C++ Funktion für String-Referenz Überlastung verwirrend und anonyme Funktion

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

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

Wenn ich mit einer anonymen Funktion aufrufen, ist es OK

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

Aber wenn ich rufe mit Schnur, hat es

sub("a"); 
fehlgeschlagen

error C2668: 'sub' : ambiguous call to overloaded function

Ist es möglich, mehrdeutig Aufruf zu vermeiden, wenn sie mit einer Schnur gegen anonyme Funktionsparameter

mit Visual C++ 2013

UPDATE2

Erstellen Sie ein neues Konsolenprojekt und setzen every von Skizze und noch immer nicht Aufruf in 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> 

UPDATE: Meine VS über Informationen:

+1

'sub (Zeichenfolge ("a"));' 'oder/* const */string a ("a"); Sub (a);/* skope leak */' –

+0

@MohitJain dies ist ein möglicher Weg, aber nicht freundlich für den Benutzer, ich hoffe," die "Definition der Funktion zu beheben, um das gleiche Ergebnis zu erreichen – Boying

+0

kann nicht reproduzieren in http: // webcompiler.cloudapp.net/ –

Antwort

3

Es ist ein Compiler-Fehler: sub(std::string("a")); ist eine angemessene Problemumgehung. (Die Bindung eines anonymes vorübergehend zu einer const Referenz ist legal in C++.)

MSVC2013 kompiliert die Anweisung

std::function<std::string()> foo("a"); 

Zeigt, dass "a" ist ein gültiges Konstruktor Argument für diesen Typen. (Scheint fehlerhafterweise den Konstruktor function(std::nullptr_t) zu verwenden).

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

+2

Warum ist es mehrdeutig mit 'std :: function'? – songyuanyao

+0

dies ist ein möglicher Weg, aber nicht freundlich für den Benutzer, ich hoffe, die Definition der Funktion zu "beheben", um das gleiche Ergebnis zu erreichen – Boying

+0

Hinzugefügt einen "Beweis durch erfolgreiche Kompilation". – Bathsheba