C++ 作用域运算符需要查找std命名空间而不是boost
我正在将boost库的部分移植到cuda/nvcc下作为设备函数进行编译。这涉及到在迭代器、数组等方面使用推力库。我发现推力库中存在编译错误,例如:C++ 作用域运算符需要查找std命名空间而不是boost,c++,boost,scope,cuda,thrust,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" 由推力线触发:
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调用之前添加scope操作符::来解决这个问题,如下所示:
typedef ::std::ptrdiff_t difference_type;
但很明显,改变推力是不行的
有人知道我为什么会遇到这个问题吗?i、 e.为什么推力头迭代器_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;
}
您也可以看到。在推进集管之前包括推力集管?另外,您是否使用名称空间指令?我正在修改数千个boost include文件,使其与设备兼容。因此推力包含在推进器的内部深处。Boost使用了大量的using namespace指令。这是行不通的,尝试设备端口已经可以用于某些特殊功能也是徒劳的。我有希望,但我同意这是相当雄心勃勃的。谢谢你——就是这样。非常感谢!
prog.cc:11:34: error: 'ptrdiff_t' in namespace 'foo::std' does not name a type
11 | using difference_type = std::ptrdiff_t;
| ^~~~~~~~~