2017-02-01 1 views
6

J'ai eu des problèmes pour essayer de faire fonctionner boost.multiprecision dans mon projet VC2017, et j'ai essayé de rendre le projet le plus simple possible comme preuve de concept:C2143/C2518 en essayant de compiler le projet en utilisant boost.multiprecision

#include<boost/multiprecision/cpp_int.hpp> 

int main() { 
    boost::multiprecision::cpp_int val{ 5 }; 
    val *= 5; 
    val *= 5; 
    return val.convert_to<int>(); 
} 

Malheureusement, ce code ne compile pas, avec les erreurs suivantes:

1>------ Build started: Project: Multiprecision Test, Configuration: Debug x64 ------ 
1>Multi Main.cpp 
1>Unknown compiler version - please run the configure tests and report the results 
1>g:\workspacec\solutions\project4x\library\include\boost\utility\compare_pointees.hpp(36): error C2143: syntax error: missing ',' before '<' 
1>g:\workspacec\solutions\project4x\library\include\boost\utility\compare_pointees.hpp(40): note: see reference to class template instantiation 'boost::equal_pointees_t<OptionalPointee>' being compiled 
1>g:\workspacec\solutions\project4x\library\include\boost\utility\compare_pointees.hpp(59): error C2143: syntax error: missing ',' before '<' 
1>g:\workspacec\solutions\project4x\library\include\boost\utility\compare_pointees.hpp(63): note: see reference to class template instantiation 'boost::less_pointees_t<OptionalPointee>' being compiled 
1>g:\workspacec\solutions\project4x\library\include\boost\numeric\conversion\detail\converter.hpp(453): error C2143: syntax error: missing ',' before '<' 
1>g:\workspacec\solutions\project4x\library\include\boost\numeric\conversion\detail\converter.hpp(467): note: see reference to class template instantiation 'boost::numeric::convdetail::trivial_converter_impl<Traits>' being compiled 
1>g:\workspacec\solutions\project4x\library\include\boost\numeric\conversion\detail\converter.hpp(453): error C2518: keyword 'typename' illegal in base class list; ignored 
1>g:\workspacec\solutions\project4x\library\include\boost\numeric\conversion\detail\converter.hpp(454): error C2518: keyword 'typename' illegal in base class list; ignored 
1>g:\workspacec\solutions\project4x\library\include\boost\numeric\conversion\detail\converter.hpp(474): error C2143: syntax error: missing ',' before '<' 
1>g:\workspacec\solutions\project4x\library\include\boost\numeric\conversion\detail\converter.hpp(497): note: see reference to class template instantiation 'boost::numeric::convdetail::rounding_converter<Traits,RangeChecker,RawConverter,Float2IntRounder>' being compiled 
1>g:\workspacec\solutions\project4x\library\include\boost\numeric\conversion\detail\converter.hpp(474): error C2518: keyword 'typename' illegal in base class list; ignored 
1>g:\workspacec\solutions\project4x\library\include\boost\numeric\conversion\detail\converter.hpp(475): error C2518: keyword 'typename' illegal in base class list; ignored 
1>g:\workspacec\solutions\project4x\library\include\boost\numeric\conversion\detail\converter.hpp(504): error C2143: syntax error: missing ',' before '<' 
1>g:\workspacec\solutions\project4x\library\include\boost\numeric\conversion\detail\converter.hpp(526): note: see reference to class template instantiation 'boost::numeric::convdetail::non_rounding_converter<Traits,RangeChecker,RawConverter>' being compiled 
1>g:\workspacec\solutions\project4x\library\include\boost\numeric\conversion\detail\converter.hpp(504): error C2518: keyword 'typename' illegal in base class list; ignored 
1>g:\workspacec\solutions\project4x\library\include\boost\numeric\conversion\detail\converter.hpp(505): error C2518: keyword 'typename' illegal in base class list; ignored 
1>Done building project "Multiprecision Test.vcxproj" -- FAILED. 
========== Build: 0 succeeded, 1 failed, 2 up-to-date, 0 skipped ========== 

ce sont les mêmes erreurs exactes que je reçois dans le projet plus complexe à l'origine utilisé boost.multiprecision. Je n'ai eu aucun problème à compiler ce code dans Visual Studio 2015. Est-ce que quelqu'un sait ce qui ne va pas, et ce que je dois faire pour le réparer?

EDIT:

Un projet utilisant boost.asio compile sans problème:

#include<boost/asio.hpp> 
#include<iostream> 

int main() { 
    boost::asio::io_service service; 
    for (int i = 0; i < 10; i++) { 
     service.post([i] { 
      std::cout << i << std::endl; 
     }); 
    } 
    service.run(); 
    system("pause"); 
    return 0; 
} 
+0

Quelle version de boost utilisez-vous? J'ai essayé votre exemple avec la version 1.63.0 sur le dernier RC MSVC 2017 et j'ai obtenu une sortie du compilateur légèrement différente. Quoi qu'il en soit, les erreurs que j'ai eu ont été corrigées par '#define _HAS_AUTO_PTR_ETC 1' avant d'inclure l'en-tête boost. Est-ce que cela règle le problème de votre côté? Je peux fournir plus de détails dans une réponse si c'est le cas. – bogdan

+0

@bogdan J'utilise 1.61.0, mais j'ai essayé un exemple sommaire avec 1.63.0 et j'ai obtenu (ce qui m'a semblé d'un coup d'oeil rapide) des erreurs identiques. Je vais essayer votre suggestion et voir ce qui se passe dès qu'une occasion se présente. – Xirema

+0

@bogdan Cela semble avoir fonctionné, donc si vous écrivez cela comme une réponse, je l'accepterai. Je voudrais, si vous en connaissez, une référence ou un article de blog d'autres macros comme celle que je devrais probablement connaître, car je me souviens avoir dû faire quelque chose de similaire pour faire fonctionner une ancienne version d'une bibliothèque de boost différente (pour un projet entièrement différent), et il semble que ce serait utile, et la documentation de l'amplification est terriblement difficile à analyser. – Xirema

Répondre

14

Le problème est causé par le fait que certains modèles de boost::multiprecision utilisent std::unary_function, qui a été dépréciées depuis C + +11 et a été retiré de la norme pour C++ 17.

L'implémentation de la bibliothèque standard dans MSVC 2015 a introduit des protections telles que #if _HAS_AUTO_PTR_ETC autour de ces définitions obsolètes. Ils sont définis par défaut sur 1 sous le nouveau commutateur /std:c++14 (valeur par défaut) et définis sur 0 par défaut sous /std:c++latest (les nouveaux commutateurs de compilation sont disponibles depuis la mise à jour 3 de 2015).

Ainsi, jusqu'à ce coup de pouce supprime les dépendances sur std::unary_function, vous devez soit pas utiliser /std:c++latest (je l'ai toujours utilisé depuis qu'il est sorti) ou #define _HAS_AUTO_PTR_ETC 1 avant d'inclure (directement ou indirectement) les en-têtes de la bibliothèque standard. Donc, soit le définir avec des options de compilateur ou dans certains PCH qui est le premier qui est inclus dans toutes les unités de traduction ou quelque chose comme ça.

Une description détaillée de ces paramètres, y compris d'autres protections qui contrôlent d'autres fonctions obsolètes ou supprimées, peut être trouvée dans this blog post par Stephan T. Lavavej. Le Visual C++ change history 2003 - 2015 semble être la liste officielle des changements de rupture dans MSVC, mais malheureusement, il ne couvre pas tous ces détails. En général, en scannant les Visual C++ Team Blog pour les posts de Stephan, vous obtiendrez les meilleures informations sur ces choses.

+0

'/ std :: C++ dernier' devrait être '/ std: C++ dernier' –

+1

@JeffreyFaust Je ne sais pas, 'std ::' se sent juste si juste ;-). Au moins, j'étais cohérent - j'ai fait la même erreur deux fois. Merci, corrigé. – bogdan