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

Scope operator needed to find std namespace instead of boost

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

    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;

我可以通过在标准库调用之前添加范围运算符 :: 来解决这个问题,例如:

   typedef ::std::ptrdiff_t difference_type;

但是修改推力显然不行

有谁知道我为什么会遇到这个问题?即为什么 thrust header iterator_traits.h 在命名空间 boost::std 而不是 std 中搜索 std::ptrdiff_t?在我包括推力头之前有没有办法扭转这个?

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

谢谢!

我只能在这里猜测,但我最好的猜测是,由于某种原因,在 std 命名空间打开之前的某处缺少关闭花括号来关闭 boost 命名空间,可能是通过包括一个标准库头文件。然后,这会导致命名空间 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