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
3
 
test: main.cpp
	g++ -o test main.cpp -W -Wall -ansi -pedantic -std=c++0x
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
Extrait du header incriminé :
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
Ma version de GCC est la 4.4.
À 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