Wie behebe ich diesen nicht aufgelösten überladenen Funktionstypfehler, wenn ich std :: function verwende?

9

Im folgenden (funktionierenden) Codebeispiel wird die templated-Funktion register_enum () verwendet, um eine Aufzählung zu durchlaufen und einen vom Benutzer bereitgestellten Callback aufzurufen, um einen Aufzählungswert in eine C-Zeichenfolge zu konvertieren. Alle Aufzählungen sind innerhalb einer Klasse definiert, und die Umwandlung von Enum in String erfolgt mit einer statischen to_cstring (enum) -Funktion. Wenn eine Klasse (wie die Shader-Klasse) mehr als eine Enumeration und die entsprechende überladene to_cstring (enum) -Funktion hat, kann der Compiler nicht entscheiden, welche der korrekten to_cstring () -Funktionen an register_enum () übergeben werden soll. Ich denke der Code erklärt besser als ich kann ...

%Vor%

Compiler-Ausgabe:

%Vor%

Wie übergebe ich die richtige to_cstring Funktion an register_enum ()? Ich weiß, dass ich die einzelnen to_cstring () Funktionen umbenennen könnte, aber ich möchte das, wenn möglich, vermeiden. Vielleicht ist mein Design stinkig und Sie können einen besseren Ansatz empfehlen.

Meine Frage erscheint ähnlich wie Aufruf überladener Funktionen mithilfe von Vorlagen (nicht aufgelöster überladener Compilerfehler der Funktion) und Wie bekomme ich die Adresse einer überladenen Mitgliedsfunktion? , aber bis jetzt kann ich diese Informationen nicht auf mein spezifisches Problem anwenden.

    
x-x 06.04.2012, 01:48
quelle

2 Antworten

7

Der Fehler sagt Ihnen, dass es zwei mögliche Überladungen gibt, die verwendet werden könnten, und der Compiler kann nicht für Sie entscheiden. Auf der anderen Seite können Sie anhand eines Cast festlegen, welche verwendet werden soll:

%Vor%

Oder ohne typedef (in einem schwer zu lesenden Einzeiler):

%Vor%

* Beachten Sie, dass in Funktionssignaturen die oberste Ebene const entfernt wird.

Die nächste Frage ist, warum hat der Compiler die entsprechende Überladung nicht selbst gefunden? Das Problem besteht darin, dass Sie beim Aufruf von register_enum den Typ der Enumeration übergeben und den Typ von std::function auf std::function< const char* ( shader::FUNC ) > festlegen, aber std::function einen Konstruktor mit Vorlagen hat, und bevor Sie versuchen, einen Schluss zu ziehen Der Compiler muss wissen, welche Überladung Sie verwenden möchten.

    
David Rodríguez - dribeas 06.04.2012, 02:07
quelle
0

Ich würde sagen, dass in diesem Fall, wenn der Compiler sich nicht zwischen den beiden Überladungen entscheiden kann, sollten Sie einen von ihnen umbenennen! Dies verhindert eine weitere mehrdeutige Verwendung der Funktionen.

    
xcski 18.01.2018 22:40
quelle

Tags und Links