以下代码使用 1.58 编译时无法使用 1.46 进行编译。我想这是一个类型转换问题,但我无法正确处理。
我的代码
#include <boost/filesystem.hpp>
#include <boost/range.hpp>
#include <boost/range/algorithm.hpp>
#include <boost/range/adaptors.hpp>
#include <vector>
using namespace boost;
using namespace filesystem;
using namespace adaptors;
int main(int argc, char ** argv)
{
recursive_directory_iterator beg = recursive_directory_iterator(".");
recursive_directory_iterator end = recursive_directory_iterator();
iterator_range<recursive_directory_iterator> files =
make_iterator_range(beg, end);
std::function<bool (path const & path)> fileFilter =
[](path const & path) -> bool {
return is_regular_file(path);
};
std::vector<path> paths;
copy(files | filtered(fileFilter), std::back_inserter(paths));
// works:
//copy(files, std::back_inserter(paths));
// also works:
//for(recursive_directory_iterator it = beg; it != end; ++it){
// if(fileFilter(*it)){
// paths.push_back(*it);
// }
//}
}
错误消息 (VS2010)
错误1 错误 C2664: 'boost::文件系统::recursive_directory_iterator::recursive_directory_iterator(const boost::文件系统::p ath &,boost::文件系统::symlink_option::enum_type)' :无法转换 参数 1 来自 'boost::iterators::d etail::p ostfix_increment_proxy' to 'const boost::filesystem::p ath &' [...]\boost\1.58.0_32\include\boost-1_58\boost\range\concepts.hpp 201 1 [...]
谁能帮忙?
编辑
作为 https://svn.boost.org/trac/boost/ticket/11228 提交。
似乎是自 Boost 1.55 以来在某处引入的错误。使用boost 1.55,这可以编译正常。
可能是这个错误:https://svn.boost.org/trac/boost/ticket/10989
boost_1_57_0/boost/concept_check.hpp|210 col 13| 错误:请求从"提升::迭代器::single_pass_traversal_tag"转换为非标量类型"提升::迭代器::forward_traversal_tag"
filtered
适配器要求输入forward_traversal
标记。但recursive_directory_iterator
只承诺single_pass_traversal
标签:
BOOST_RANGE_CONCEPT_ASSERT((
Convertible<
BOOST_DEDUCED_TYPENAME ForwardIteratorConcept::traversal_category,
forward_traversal_tag
>));
解决方法
您现在可以禁用概念检查: -DBOOST_RANGE_ENABLE_CONCEPT_ASSERT=0
:
住在科里鲁
#include <boost/filesystem.hpp>
#include <boost/range.hpp>
#include <boost/range/algorithm.hpp>
#include <boost/range/adaptors.hpp>
#include <vector>
#include <iostream>
namespace fs = boost::filesystem;
using namespace boost::adaptors;
int main() {
fs::recursive_directory_iterator beg("."), end;
auto fileFilter = [](fs::path const & path) { return is_regular_file(path); };
std::vector<fs::path> paths;
copy(boost::make_iterator_range(beg, end) | filtered(fileFilter), std::back_inserter(paths));
for(auto& p : paths)
std::cout << p << "n";
}
指纹
"./main.cpp"
"./a.out"