范围运算符需要查找std名称空间而不是boost

时间:2018-12-28 00:39:23

标签: c++ boost scope cuda thrust

我正在努力移植boost库的一部分,以便在cuda / nvcc下作为设备功能进行编译。这涉及将推力库用于某些东西,例如迭代器,数组等。我发现的一个问题是推力库中的编译错误,例如:

    C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1\include\thrust/iterator/iterator_traits.h(66): error : namespace "boost::std" has no member "ptrdiff_t"

由推力线触发:

   typedef std::ptrdiff_t difference_type;

我可以通过在std lib调用之前添加范围运算符::来解决此问题:

   typedef ::std::ptrdiff_t difference_type;

但显然不能修改推力。

有人知道我为什么遇到这个问题吗?即为什么推力头文件iterator_traits.h在名称空间boost :: std而不是std中搜索std :: ptrdiff_t?在添加推力头之前,有没有办法扭转这种情况?

由于移植诸如boost这样的大型库的性质,在此处提供一个最小的工作示例并不容易。

谢谢!

1 个答案:

答案 0 :(得分:4)

我只能在这里猜测,但我最好的猜测是,由于某种原因,在打开boost命名空间之前,缺少用于关闭std命名空间的关闭大括号。标准库头。然后,这导致名称空间boost::std存在,因此当std::ptrdiff_t名称空间当前处于打开状态时,编译器将在boost的子名称空间中查找。

例如用gcc编译以下源文件

#include <cstddef>

namespace foo {

// this creates a namespace ::foo::std
#include <typeinfo>

}

namespace foo {
    using difference_type = std::ptrdiff_t;
}

还打印

prog.cc:11:34: error: 'ptrdiff_t' in namespace 'foo::std' does not name a type
   11 |     using difference_type = std::ptrdiff_t;
      |                                  ^~~~~~~~~

也可以看到here