Erstellen Sie einen Zeiger zum Element für den Map-Werttyp in vc2010

8

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:

%Vor%

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?

    
Richard Corden 21.01.2013, 13:39
quelle

2 Antworten

3

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:

%Vor%

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:

%Vor%

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.

    
Andy Prowl 21.01.2013, 14:38
quelle
4

Warum bestehen Sie darauf, den Pointer-to-Member als Nicht-Typ-Template Parameter / Argument zu behalten?

Wie auch immer, ich denke, dass Sie das verwenden könnten, wenn Sie entweder auf Visual Studio 2010 oder auf Compiler mit decltype()

beschränkt sind %Vor%     
wilx 21.01.2013 14:26
quelle

Tags und Links