提升1.53和1.58的差异

时间:2015-07-06 12:45:22

标签: c++ boost

以下是我写的一小段简单的代码:

#include<iostream>
#include<boost/filesystem.hpp>

using namespace std;
namespace fs = boost::filesystem;

int main(int argc, char** argv)
{

        fs::directory_iterator it((fs::path(argv[1])));
        fs::directory_iterator endit;

        while(it != endit)
        {
                cout<<it->path().string()<<endl;
                ++it;
        }
}

然后我写了一个非常简单的CMakeLists.txt文件,如下所示:

cmake_minimum_required(VERSION 2.8)
project(test)
find_package(Boost COMPONENTS filesystem system REQUIRED)
include_directories(${Boost_INCLUDE_DIR})
add_executable(test test.cpp)
target_link_libraries(test ${Boost_LIBRARIES})

当我在OS X Yosemite上编译此代码时,它运行得很好。

编译器详细信息如下:

$ g++ -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.3.0
Thread model: posix

然后我在Fedora 19系统上运行它,它确实在编译期间产生错误。错误消息很长。我的项目涉及许多源文件,但对于这个问题,错误消息的一部分足以理解问题:

/user/uujjwal/home/code/pom-final/test/abc.cpp: In function 'int main(int, char**)':
/user/uujjwal/home/code/pom-final/test/abc.cpp:13:10: error: no match for 'operator!=' (operand types are 'boost::filesystem::directory_iterator(boost::filesystem::path*)' and 'boost::filesystem::directory_iterator')
  while(it!=endit)

因此它表明运算符!=无效。

Fedora系统的编译器细节是:

$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.2/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-isl=/builddir/build/BUILD/gcc-4.8.2-20131017/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.2-20131017/obj-x86_64-redhat-linux/cloog-install --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.8.2 20131017 (Red Hat 4.8.2-1) (GCC) 

OS X上的Boost版本 - 1.58 在Fedora系统上提升版本 - 1.53

我想知道这是由于两个版本之间的根本区别吗?是其他原因吗?如果我必须对代码进行一些更改,以使其可移植,那么正确的方法是什么?

**** PS: - 我也注意到在Fedora上的实验,如果,请执行以下**

 fs::path root_path(argv[1]);
    fs::directory_iterator it(root_path);

然后汇编。那么差异何在?为什么?**

1 个答案:

答案 0 :(得分:4)

错误消息中的LHS操作数类型为boost::filesystem::directory_iterator(boost::filesystem::path*)。这表明您遇到了最令人烦恼的解析错误; it的声明被解析为函数声明而不是局部变量声明实例化:

    fs::directory_iterator it(fs::path(argv[1]));

将其解析为名为it的extern函数的声明,在衰减后获取类型argvfs::path[1])的一个参数(名为fs::path*)并返回{ {1}}。

奇怪的是你的额外括号应该阻止了MVP错误。您的gcc版本是错误的并且忽略它们,或者您正在呈现的代码与传递给编译器的内容之间发生了某些变化。

fs::directory_iterator