范围运算符需要找到 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。
我正在努力移植部分 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。