提升directory_iterator:'begin'和'end'未声明

时间:2016-10-25 13:22:17

标签: c++ boost

我正在尝试学习如何使用Boost C ++库,但我遇到了一个问题。运行以下boost :: filesystem教程代码时:

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

int main(int argc, char* argv[])
{
    if (argc < 2)
    {
        cout << "Usage: tut3 path\n";
        return 1;
    }

    path p (argv[1]);

    try
    {
        if (exists(p))
        {
            if (is_regular_file(p))
                cout << p << " size is " << file_size(p) << '\n';

            else if (is_directory(p))
            {
                cout << p << " is a directory containing:\n";

                for (directory_entry& x : directory_iterator(p))
                    cout << "    " << x.path() << '\n'; 
            }
            else
                cout << p << " exists, but is not a regular file or directory\n";
        }
        else
            cout << p << " does not exist\n";
    }

    catch (const filesystem_error& ex)
    {
        cout << ex.what() << '\n';
    }

    return 0;
}

并编译:

g++ -std=c++11 main.cpp -o main -L$BOOST_ROOT -lboost_filesystem -lboost_system

或:

g++ -std=c++11 main.cpp -o main -L$BOOST_ROOT -lboost_system -lboost_filesystem

其中BOOST_ROOT是我提取boost_1_62_0.tar.gz的路径,我收到以下错误:

FoamData.cpp:36:76: error: ‘begin’ was not declared in this scope
          for (auto&& x : boost::filesystem::directory_iterator(p))
                                                                 ^
FoamData.cpp:36:76: note: suggested alternative:
In file included from /usr/include/c++/5/vector:66:0,
                 from FoamData.hpp:4,
                 from FoamData.cpp:1:
/usr/include/c++/5/bits/range_access.h:87:5: note:   ‘std::begin’
     begin(_Tp (&__arr)[_Nm])
     ^
FoamData.cpp:36:76: error: ‘end’ was not declared in this scope
          for (auto&& x : boost::filesystem::directory_iterator(p))
                                                                 ^
FoamData.cpp:36:76: note: suggested alternative:
In file included from /usr/include/c++/5/vector:66:0,
                 from FoamData.hpp:4,
                 from FoamData.cpp:1:
/usr/include/c++/5/bits/range_access.h:97:5: note:   ‘std::end’
     end(_Tp (&__arr)[_Nm])
     ^
make: *** [FoamData.o] Error 1

我事先道歉,如果我掩饰了一些显而易见的东西。

修改

后续boost_filesystem教程中的以下语句给出了同样的错误:

for(auto&& x : directory_iterator(p))

代码来源: boost::filesystem tutorials

更新

我重新编译了boost_1_62_0并运行了教程脚本来构建教程代码(根据boost文件系统教程)。构建的教程程序正常工作。但是,在$BOOST_ROOT之外使用g ++进行编译时,我收到以下错误:

./tester: error while loading shared libraries: libboost_system.so.1.62.0: cannot open shared object file: No such file or directory

以下是我的makefile

CC=g++
INCLUDE=-I/usr/local/boost_1_62_0
CFLAGS=-std=c++11 -Wall -Wextra -g
LDFLAGS=-lboost_filesystem -lboost_system
LDLIB=-L/usr/local/boost_1_62_0/stage/lib

all: tester

tester: main.o
    $(CC) main.o $(LDLIB) $(LDFLAGS) $(CFLAGS) -o tester

main.o: main.cpp
    $(CC) -c main.cpp $(INCLUDE) $(CFLAGS)

clean:
    rm *.o tester

最终更新

我可以通过将此错误添加到我的.bashrc

来消除我的最后一个错误

export LD_LIBRARY_PATH="$BOOST_ROOT/stage/lib:$LD_LIBRARY_PATH"

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

很可能您的代码使用了错误(且过时)的系统Boost库begin()中未提供end()directory_iterator成员。

原因是,在您的g ++命令行中,您使用-L提供了额外的库路径,但是您忘记使用-I添加额外的包含路径。

您可以为升级版本添加编译时检查,如下所示:

#include <boost/static_assert.hpp>
BOOST_STATIC_ASSERT(BOOST_VERSION >= 106200) // check for at least 1.62.0

答案 1 :(得分:0)

请尝试使用以下语法:

   if (is_directory(p))
   {
      directory_iterator end_iter;

      for (directory_iterator dir_itr(p);
          dir_itr != end_iter;
          ++dir_itr)
      {
         std::cout << dir_itr->path().filename() << "\n";
      }
   }

这将列出目录中的所有文件。

您的代码的问题在于您没有将directory_iterator(p)返回的对象视为迭代器。

您在for循环中使用的语法需要range expression,在这种情况下应该是一个具有beginend方法的对象迭代器。从错误中可以看出,编译器正在寻找这些成员。

Howerver,你已经明确地创建了开始迭代器 - 你来不及使用for循环的范围语法。