帮我调试一下 - C ++ Boost

时间:2010-12-10 09:47:14

标签: c++ boost

我很喜欢C ++ Boost。这里的任何人都可以帮我调试这个程序。

#include <iostream>
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/fstream.hpp>
using namespace boost::filesystem; 
using namespace std;

void show_files( const path & directory, bool recurse_into_subdirs = true )
{
  if( exists( directory ) )
  {
    directory_iterator end ;
    for( directory_iterator iter(directory) ; iter != end ; ++iter )
      if ( is_directory( *iter ) )
      {
        cout << iter->native_directory_string() << " (directory)\n" ;
        if( recurse_into_subdirs ) show_files(*iter) ;
      }
      else 
        cout << iter->native_file_string() << " (file)\n" ;
  }
}

int main()
{
    show_files( "." ) ;
}

温我试图运行这个程序我得到的错误就像

ex2.cpp: In function ‘void show_files(const boost::filesystem2::path&, bool)’:
ex2.cpp:15: error: ‘class boost::filesystem2::basic_directory_entry<boost::filesystem2::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem2::path_traits> >’ has no member named ‘native_directory_string’
ex2.cpp:19: error: ‘class boost::filesystem2::basic_directory_entry<boost::filesystem2::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem2::path_traits> >’ has no member named ‘native_file_string’
提前Tanx。附:该程序将列出所有文件/文件夹

3 个答案:

答案 0 :(得分:4)

要使其正常工作,您需要进行两项更改。首先,迭代器返回basic_directory_entry的实例,而不是路径。首先,您需要从迭代器中查询path。此外,较新版本的boost已经从访问器方法中删除了native_前缀。

以下是包含更改的代码:

#include <iostream>
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/fstream.hpp>
using namespace boost::filesystem; 
using namespace std;

void show_files( const path & directory, bool recurse_into_subdirs = true )
{
  if( exists( directory ) )
  {
    directory_iterator end ;
    for( directory_iterator iter(directory) ; iter != end ; ++iter )
    if ( is_directory( *iter ) )
    {
      cout << iter->path().directory_string() << " (directory)\n" ;
      if( recurse_into_subdirs ) show_files(*iter) ;
    }
    else 
      cout << iter->path().file_string() << " (file)\n" ;
  }
}

int main()
{
    show_files( "." ) ;
}

答案 1 :(得分:4)

由于我不能简单地在(当前)最佳答案中添加评论,我想留意

boost :: filesystem :: wpath :: native_file_string()被弃用并更改为boost :: filesystem :: wpath :: string()。所以以下一行

cout << iter->native_file_string() << " (file)\n" ;

变为

cout << iter->string() << " (file)\n" ;

答案 2 :(得分:1)

我快速查看了文档,但在basic_directory_entry中找不到native_directory_stringnative_file_string。 AFAICT,这些成员函数属于不同的类(filesystem::path),我认为您可以从basic_directory_entry访问它们:

iter->path().native_directory_string()