title: Using recursive_directory_iterator in an old version of boost?
body: <p>I need to recursively iterate through a directory; I got a pretty nice function for it from another thread here on SO; adapted it just a tiny bit for my purposes and it works perfectly on Mac with boost 1.62 and clang.</p>
  
  <p>However, we're using SemaphoreCI (based on ubuntu 14.04 LTS and boost 1.54) and I just cannot get this to compile under those conditions.</p>
  
  <pre><code>#include &lt;boost/algorithm/string/replace.hpp&gt;
  #include &lt;boost/filesystem.hpp&gt;
  #include &lt;boost/range.hpp&gt;
  void copyDirectoryRecursively(const fs::path&amp; sourceDir, const fs::path&amp; destinationDir)
  {
      if (!fs::exists(sourceDir) || !fs::is_directory(sourceDir))
      {
          throw std::runtime_error("Source directory " + sourceDir.string() + " does not exist or is not a directory");
      }
      if (!fs::create_directory(destinationDir) &amp;&amp; !fs::exists(destinationDir))
      {
          throw std::runtime_error("Cannot create destination directory " + destinationDir.string());
      }
  
      for (const auto&amp; dirEnt : fs::recursive_directory_iterator{sourceDir})
      {
          const auto&amp; path = dirEnt.path();
          auto relativePathStr = path.string();
          boost::algorithm::replace_first(relativePathStr, sourceDir.string(), "");
          try { 
          if (!fs::is_directory(path)) { fs::copy_file(path, destinationDir / relativePathStr); }
          else { fs::copy_directory(path, destinationDir / relativePathStr); }
          }
          catch (...) {
          throw std::runtime_error("Cannot copy file " + path.string() + ", because it already exists in the destination folder.");
          }
      }
  }
  </code></pre>
  
  <p>Here's the error I'm getting,</p>
  
  <p>GCC: </p>
  
  <pre><code>/home/runner/performous/game/fs.cc: In function ‘void copyDirectoryRecursively(const boost::filesystem::path&amp;, const boost::filesystem::path&amp;)’:
  /home/runner/performous/game/fs.cc:74:73: error: no matching function for call to ‘begin(boost::filesystem::recursive_directory_iterator&amp;)’
       for (const auto&amp; dirEnt : fs::recursive_directory_iterator{sourceDir})
                                                                           ^
  /home/runner/performous/game/fs.cc:74:73: note: candidates are:
  In file included from /usr/include/c++/4.8/string:51:0,
                   from /usr/include/c++/4.8/bits/locale_classes.h:40,
                   from /usr/include/boost/variant/variant.hpp:31,
                   from /home/runner/performous/game/configuration.hh:3,
                   from /home/runner/performous/game/fs.cc:2:
  /usr/include/c++/4.8/bits/range_access.h:87:5: note: template&lt;class _Tp, long unsigned int _Nm&gt; _Tp* std::begin(_Tp (&amp;)[_Nm])
       ^
  /usr/include/c++/4.8/bits/range_access.h:87:5: note:   template argument deduction/substitution failed:
                   from /usr/include/c++/4.8/ostream:38,
                   from /usr/include/c++/4.8/bits/ios_base.h:41,
       for (const auto&amp; dirEnt : fs::recursive_directory_iterator{sourceDir})
                   from /usr/include/c++/4.8/ios:42,
                   from /usr/include/boost/variant/detail/move.hpp:22,
                   from /usr/include/c++/4.8/iterator:64,
                   from /usr/include/boost/variant/detail/initializer.hpp:23,
                   from /usr/include/c++/4.8/iterator:64,
                   from /usr/include/c++/4.8/ostream:38,
                   from /usr/include/boost/variant.hpp:17,
       begin(_Tp (&amp;__arr)[_Nm])
                   from /usr/include/boost/variant/detail/move.hpp:22,
                   from /usr/include/boost/variant/detail/initializer.hpp:23,
                   from /usr/include/boost/variant/variant.hpp:31,
  /home/runner/performous/game/fs.cc:74:73: note:   mismatched types ‘_Tp [_Nm]’ and ‘boost::filesystem::recursive_directory_iterator’
                   from /usr/include/boost/variant.hpp:17,
                                                                           ^
  In file included from /usr/include/c++/4.8/string:51:0,
                   from /home/runner/performous/game/configuration.hh:3,
                   from /home/runner/performous/game/fs.cc:2:
                   from /usr/include/c++/4.8/bits/locale_classes.h:40,
       begin(const _Container&amp; __cont) -&gt; decltype(__cont.begin())
  /usr/include/c++/4.8/bits/range_access.h:58:5: note: template&lt;class _Container&gt; decltype (__cont.begin()) std::begin(const _Container&amp;)
  /usr/include/c++/4.8/bits/range_access.h: In substitution of ‘template&lt;class _Container&gt; decltype (__cont.begin()) std::begin(const _Container&amp;) [with _Container = boost::filesystem::recursive_directory_iterator]’:
  /usr/include/c++/4.8/bits/range_access.h:58:5: note:   template argument deduction/substitution failed:
                   from /usr/include/c++/4.8/bits/ios_base.h:41,
  /home/runner/performous/game/fs.cc:74:73:   required from here
  /usr/include/c++/4.8/bits/range_access.h:58:5: error: ‘const class boost::filesystem::recursive_directory_iterator’ has no member named ‘begin’
                   from /usr/include/c++/4.8/ios:42,
  /usr/include/c++/4.8/bits/range_access.h:48:5: note: template&lt;class _Container&gt; decltype (__cont.begin()) std::begin(_Container&amp;)
       begin(_Container&amp; __cont) -&gt; decltype(__cont.begin())
       ^
  /usr/include/c++/4.8/bits/range_access.h: In substitution of ‘template&lt;class _Container&gt; decltype (__cont.begin()) std::begin(_Container&amp;) [with _Container = boost::filesystem::recursive_directory_iterator]’:
  /usr/include/c++/4.8/bits/range_access.h:48:5: error: ‘class boost::filesystem::recursive_directory_iterator’ has no member named ‘begin’
  /home/runner/performous/game/fs.cc:74:73:   required from here
                   from /usr/include/boost/config/no_tr1/utility.hpp:21,
  In file included from /usr/include/c++/4.8/utility:74:0,
                   from /usr/include/boost/config/select_stdlib_config.hpp:37,
                   from /usr/include/boost/config.hpp:40,
       ^
                   from /usr/include/boost/variant/detail/config.hpp:16,
                   from /usr/include/boost/variant/variant.hpp:23,
                   from /usr/include/boost/variant.hpp:17,
                   from /home/runner/performous/game/configuration.hh:3,
  /usr/include/c++/4.8/initializer_list:89:5: note: template&lt;class _Tp&gt; constexpr const _Tp* std::begin(std::initializer_list&lt;_Tp&gt;)
                   from /home/runner/performous/game/fs.cc:2:
       begin(initializer_list&lt;_Tp&gt; __ils) noexcept
       ^
  /usr/include/c++/4.8/bits/range_access.h:48:5: note:   template argument deduction/substitution failed:
  /usr/include/c++/4.8/initializer_list:89:5: note:   template argument deduction/substitution failed:
  /home/runner/performous/game/fs.cc:74:73: note:   ‘boost::filesystem::recursive_directory_iterator’ is not derived from ‘std::initializer_list&lt;_Tp&gt;’
       for (const auto&amp; dirEnt : fs::recursive_directory_iterator{sourceDir})
  /home/runner/performous/game/fs.cc:74:73: error: no matching function for call to ‘end(boost::filesystem::recursive_directory_iterator&amp;)’
                   from /usr/include/c++/4.8/bits/locale_classes.h:40,
  In file included from /usr/include/c++/4.8/string:51:0,
  /home/runner/performous/game/fs.cc:74:73: note: candidates are:
                   from /usr/include/c++/4.8/iterator:64,
                   from /usr/include/c++/4.8/bits/ios_base.h:41,
                                                                           ^
                   from /usr/include/boost/variant/detail/move.hpp:22,
                   from /usr/include/c++/4.8/ostream:38,
                   from /usr/include/c++/4.8/ios:42,
                   from /usr/include/boost/variant/detail/initializer.hpp:23,
                   from /usr/include/boost/variant.hpp:17,
                   from /home/runner/performous/game/configuration.hh:3,
                   from /usr/include/boost/variant/variant.hpp:31,
  /usr/include/c++/4.8/bits/range_access.h:97:5: note: template&lt;class _Tp, long unsigned int _Nm&gt; _Tp* std::end(_Tp (&amp;)[_Nm])
                   from /home/runner/performous/game/fs.cc:2:
  /usr/include/c++/4.8/bits/range_access.h:97:5: note:   template argument deduction/substitution failed:
       ^
       end(_Tp (&amp;__arr)[_Nm])
  /home/runner/performous/game/fs.cc:74:73: note:   mismatched types ‘_Tp [_Nm]’ and ‘boost::filesystem::recursive_directory_iterator’
       for (const auto&amp; dirEnt : fs::recursive_directory_iterator{sourceDir})
                                                                           ^
  In file included from /usr/include/c++/4.8/string:51:0,
                   from /usr/include/c++/4.8/bits/locale_classes.h:40,
                   from /usr/include/c++/4.8/bits/ios_base.h:41,
                   from /usr/include/c++/4.8/ios:42,
                   from /usr/include/c++/4.8/ostream:38,
                   from /usr/include/c++/4.8/iterator:64,
                   from /usr/include/boost/variant/detail/move.hpp:22,
                   from /usr/include/boost/variant.hpp:17,
                   from /usr/include/boost/variant/variant.hpp:31,
                   from /usr/include/boost/variant/detail/initializer.hpp:23,
                   from /home/runner/performous/game/configuration.hh:3,
                   from /home/runner/performous/game/fs.cc:2:
       ^
       end(const _Container&amp; __cont) -&gt; decltype(__cont.end())
  /usr/include/c++/4.8/bits/range_access.h:78:5: note: template&lt;class _Container&gt; decltype (__cont.end()) std::end(const _Container&amp;)
  /usr/include/c++/4.8/bits/range_access.h: In substitution of ‘template&lt;class _Container&gt; decltype (__cont.end()) std::end(const _Container&amp;) [with _Container = boost::filesystem::recursive_directory_iterator]’:
  /usr/include/c++/4.8/bits/range_access.h:78:5: note:   template argument deduction/substitution failed:
  /home/runner/performous/game/fs.cc:74:73:   required from here
  /usr/include/c++/4.8/bits/range_access.h:78:5: error: ‘const class boost::filesystem::recursive_directory_iterator’ has no member named ‘end’
       end(_Container&amp; __cont) -&gt; decltype(__cont.end())
  /usr/include/c++/4.8/bits/range_access.h:68:5: note: template&lt;class _Container&gt; decltype (__cont.end()) std::end(_Container&amp;)
  /usr/include/c++/4.8/bits/range_access.h:68:5: note:   template argument deduction/substitution failed:
  
       ^/usr/include/c++/4.8/bits/range_access.h: In substitution of ‘template&lt;class _Container&gt; decltype (__cont.end()) std::end(_Container&amp;) [with _Container = boost::filesystem::recursive_directory_iterator]’:
  /home/runner/performous/game/fs.cc:74:73:   required from here
  /usr/include/c++/4.8/bits/range_access.h:68:5: error: ‘class boost::filesystem::recursive_directory_iterator’ has no member named ‘end’
  In file included from /usr/include/c++/4.8/utility:74:0,
                   from /usr/include/boost/config/no_tr1/utility.hpp:21,
                   from /usr/include/boost/config/select_stdlib_config.hpp:37,
                   from /usr/include/boost/config.hpp:40,
                   from /usr/include/boost/variant/detail/config.hpp:16,
                   from /usr/include/boost/variant/variant.hpp:23,
                   from /usr/include/boost/variant.hpp:17,
                   from /home/runner/performous/game/configuration.hh:3,
                   from /home/runner/performous/game/fs.cc:2:
  /usr/include/c++/4.8/initializer_list:99:5: note: template&lt;class _Tp&gt; constexpr const _Tp* std::end(std::initializer_list&lt;_Tp&gt;)
       end(initializer_list&lt;_Tp&gt; __ils) noexcept
       ^
  /usr/include/c++/4.8/initializer_list:99:5: note:   template argument deduction/substitution failed:
  /home/runner/performous/game/fs.cc:74:73: note:   ‘boost::filesystem::recursive_directory_iterator’ is not derived from ‘std::initializer_list&lt;_Tp&gt;’
       for (const auto&amp; dirEnt : fs::recursive_directory_iterator{sourceDir})
                                                                           ^
  make[2]: *** [game/CMakeFiles/performous.dir/fs.cc.o] Error 1
  make[1]: *** [game/CMakeFiles/performous.dir/all] Error 2
  make: *** [all] Error 2
  </code></pre>
  
  <p>Clang: </p>
  
  <pre><code>/home/runner/performous/game/fs.cc:74:29: error: invalid range expression of
        type 'boost::filesystem::recursive_directory_iterator'; no viable 'begin'
        function available
      for (const auto&amp; dirEnt : fs::recursive_directory_iterator{sourceDir})
                              ^ ~~
  1 error generated.
  make[2]: *** [game/CMakeFiles/performous.dir/fs.cc.o] Error 1
  make[1]: *** [game/CMakeFiles/performous.dir/all] Error 2
  make: *** [all] Error 2
  </code></pre>