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.
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.