我正在努力移植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这样的大型库的性质,在此处提供一个最小的工作示例并不容易。
谢谢!
答案 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。