Was bedeutet es, wenn Visual Studio 2012 einen Kompilierungsfehler auslöst, der für VS2012 nicht vorhanden sein sollte?

8

Wenn ich eine Klasse kompiliere, die Boost-Serialisierung verwendet, bekomme ich den Kompilierfehler C2996, siehe unten für die Nachricht selbst. Wenn ich diesen Fehler suche, scheint es, dass dieser Fehler nur von viel älteren Versionen des Compilers ausgelöst wurde. Wie kann das sein?

Die Fehlermeldung:

  

E: \ Lib \ boost_1_54_0 \ boost / serialisierung / split_member.hpp (42): Fehler C2996: 'boost :: hash_combine': rekursive Funktionsschablonendefinition

VS2013, VS2012 und auch VS2012 Update 4 zeigten dieses Verhalten.

    
ikku100 15.01.2014, 14:04
quelle

1 Antwort

4

Ich hatte ein ähnliches Problem. Dies scheint mir ein Fehler in VS2012 (und darüber). Ich konnte dies in einer einfachen CPP-Datei reproduzieren, also öffnete ich ein Verbindungsticket .

Ich glaube, dass dieser Fehler fälschlicherweise gemeldet wird, wenn alle folgenden Bedingungen zutreffen:

  1. Ein Objekt wird deserialisiert , indem Boost-Serialisierung irgendwo in der * .cpp-Datei verwendet wird.
  2. Das serialisierte Objekt ist "tief genug" (~ 5 Ebenen - d. h. A enthält einen Vektor von B, B enthält einen Vektor von C usw. bis E).
  3. Irgendwo in derselben * .cpp-Datei (nicht unbedingt in der gleichen Funktion) wird eine Template-Funktion aufgerufen.

Der Fehler wird nicht mehr gemeldet, wenn das Objekt geändert wird, um "flacher" zu sein, oder wenn der Aufruf der Vorlagenfunktion entfernt wird.

Dieser Fehler reproduziert auch nicht in VS2010. Ich habe Boost Versionen 1.49, 1.52, 1.55 getestet.

Mögliche Problemumgehung: In einem Fall trat der Fehler nur auf, wenn wir boost::serialization::object_serializable (statt der Standard object_class_info ) verwendet haben. Ein Wechsel zurück zu object_class_info kann daher eine Umgehungslösung sein, außer dass die Abwärtskompatibilität mit zuvor serialisierten Daten aufgehoben wird.

Mögliche Problemumgehung # 2: Blenden Sie den Vorlagenfunktionsaufruf in einer separaten Übersetzungseinheit aus.

Der folgende Code gibt den Fehler wieder:

%Vor%     
Yodan Tauber 30.01.2014, 11:41
quelle