Оператору области нужно было найти пространство имен std вместо boost - PullRequest
0 голосов
/ 28 декабря 2018

Я работаю над переносом частей библиотеки 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"

, которая вызывается строкой в ​​Thrust:

   typedef std::ptrdiff_t difference_type;

Я могу это исправить, добавив оператор видимости :: перед вызовом std lib, например:

   typedef ::std::ptrdiff_t difference_type;

, но, очевидно, не стоит изменять тягу.

Кто-нибудь знает, почему я получаю эту проблему?то есть почему заголовок тяги iterator_traits.h ищет std :: ptrdiff_t внутри пространства имен boost :: std, а не std?Есть ли способ изменить это до того, как я добавлю заголовок тяги?

Нелегко привести здесь минимальный рабочий пример из-за характера переноса большой библиотеки, такой как boost.

Спасибо!

1 Ответ

0 голосов
/ 28 декабря 2018

Я могу только догадываться здесь, но мое лучшее предположение заключается в том, что по какой-то причине отсутствует закрывающая фигурная скобка для закрытия пространства имен 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;
      |                                  ^~~~~~~~~

, как вы можете видеть здесь .

...