Wir haben ein Problem damit, unseren Code auf die etwas weniger alte Version 2010 von VC ++ zu portieren.
Die Probleme werden durch die Implementierung der Zuordnung in VC verursacht, die zu einer Konvertierung von pointer-to-member
in eine% ce_de%, die erforderlich ist, um eine Basis zu erhalten, führt:
Die folgende Nachricht wird generiert:
Die Standardkonvertierung von Zeiger zu Element der Basis zu Zeiger zu Element der abgeleiteten Klasse wird nicht auf die Template-Argumente file.cc (x) angewendet: Fehler C2973: 'f': ungültiges Template-Argument 'int std :: _ Pair_base & lt; _Ty1, _Ty2 & gt; :: *'
So scheint es, dass die Implementierung von non-type-argument
in value_type
das Paar in einer Basisklasse hat.
Irgendwelche Ideen, wie Sie diese und lösen können, behalten std::map
als pointer-to-member
?
Ist unsere einzige Option, die Struktur so zu ändern, dass non-type-argument
ein f
mit einem Mitglied functor
ist?
Vorausgesetzt, dass Ihr Code IMO kompilieren sollte (und dies in GCC 4.7.2 und Clang 3.2), glaube ich, dass Ihr Design unnötig kompliziert ist. A pair
hat nur zwei Mitgliedsvariablen, so dass Sie entweder auf die erste oder die zweite zugreifen können.
Ich sehe auch keinen Bedarf für ein Funktor-Objekt: Verwenden Sie einfach ein boolesches Template-Argument, um zu bestimmen, ob der Code in der first
oder in der second
Member-Variable funktionieren soll.
Hier ist eine Möglichkeit:
Wenn Sie Ihren Clientcode oder Code in der f()
-Funktion wirklich nicht ändern können, dann können Sie sich für diesen VS2010-spezifischen Hack entscheiden:
Wenn schließlich Ihr Code auf anderen Plattformen kompiliert werden muss und alle Einschränkungen für die Nichtmodifizierbarkeit des Funktionscodes und des Clientcodes noch gelten, können Sie ein Präprozessormakro definieren, das auf% erweitert wird. co_de% für VS2010 und die leere Zeichenfolge für andere Compiler.
Tags und Links c++ visual-c++