Bonjour tout le monde,
Le tr1 de GCC et boost::filesystem ne semblent pas faire bon ménage :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 #include <tr1/type_traits> #include <boost/filesystem/operations.hpp> int main() { }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3test: main.cpp g++ -o test main.cpp -W -Wall -ansi -pedantic -std=c++0x
Extrait du header incriminé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 In file included from main.cpp:2: /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../../include/c++/4.4.0/tr1_impl/type_traits: In function bool boost::filesystem::is_empty(const boost::filesystem::path&): /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../../include/c++/4.4.0/tr1_impl/type_traits:326: erreur: template<class _Tp> struct std::is_empty is not a function, /usr/include/boost/filesystem/operations.hpp:361: erreur: conflict with template<class Path> typename boost::enable_if<boost::filesystem::is_basic_path<Path>, bool>::type boost::filesystem::is_empty(const Path&) /usr/include/boost/filesystem/operations.hpp:660: erreur: in call to is_empty /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../../include/c++/4.4.0/tr1_impl/type_traits: In function bool boost::filesystem::is_empty(const boost::filesystem::wpath&): /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../../include/c++/4.4.0/tr1_impl/type_traits:326: erreur: template<class _Tp> struct std::is_empty is not a function, /usr/include/boost/filesystem/operations.hpp:361: erreur: conflict with template<class Path> typename boost::enable_if<boost::filesystem::is_basic_path<Path>, bool>::type boost::filesystem::is_empty(const Path&) /usr/include/boost/filesystem/operations.hpp:662: erreur: in call to is_empty make: *** [test] Erreur 1
Ma version de GCC est la 4.4.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 // VC++ 7.0 and earlier has a serious namespace bug that causes a clash // between boost::filesystem::is_empty and the unrelated type trait // boost::is_empty. # if !defined( BOOST_MSVC ) || BOOST_MSVC > 1300 BOOST_FS_FUNC(bool) is_empty( const Path & ph ) //<-- l'erreur est ici # else BOOST_FS_FUNC(bool) _is_empty( const Path & ph ) # endif
À votre avis, de qui vient l'erreur (et à qui faire un rapport de bug) ? Boost ou GCC ?
C'est tout de même étrange d'avoir un conflit entre deux fonctions de deux namespaces différents. D'autant plus étrange que Visual C++ 7.0 et inférieur aurait un problème similaire…
Quelqu'un avec un compilo différent peut-il me dire s'il a le même problème ?
Remarque : J'ai essayé de préfixer le nom de la fonction par un underscore, comme dans le #else, mais ce n'est pas franchement mieux :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 g++ -o test main.cpp -W -Wall -ansi -pedantic In file included from main.cpp:2: /usr/include/boost/filesystem/operations.hpp: In function bool boost::filesystem::is_empty(const boost::filesystem::path&): /usr/include/boost/filesystem/operations.hpp:660: erreur: expected primary-expression before > token /usr/include/boost/filesystem/operations.hpp: In function bool boost::filesystem::is_empty(const boost::filesystem::wpath&): /usr/include/boost/filesystem/operations.hpp:662: erreur: expected primary-expression before > token make: *** [test] Erreur 1
Partager