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;
}
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
@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
@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