После проверки командой разработчиков NVIDIA выясняется, что это может быть причиной ошибки в компиляторе gnu.Это правда, что внешняя обработка цепочкой инструментов nvcc
создает код хоста (переданный компилятору хоста), который отбрасывает квалификацию пространства имен для типа b
, но это должно быть приемлемо, поскольку B
ужебыло объявлено в test0
пространстве имен.
Похоже, что уже было сообщено сообществу gnu.
В качестве вспомогательной точки данных, clang ++ 3.9.1 onFedora 25 компилирует код, указанный в ответе , заданном @talonmies, без ошибок и предупреждений.При тестировании через gnu 6.4.1 на Fedora25 цепочка инструментов gnu по-прежнему выдает ошибку.Я не претендую на это как на доказательство, просто на предположение, что утверждение об ошибке в gnu может быть правильным.Я не эксперт по языку.Кроме того, я не хочу здесь спорить об этом;Это не цель этого вопроса или ответа.
Команда разработчиков NVIDIA взяла рассматриваемый вопрос и надеется найти исправление или обходной путь в будущем выпуске CUDA.
Тем временем,Предлагаемый обходной путь на уровне источника - использовать фиктивную typedef для B
в классе A
.т.е.:
class A {
typedef B dummy_t;
friend void test1::f(dummy_t & b);
};
ОБНОВЛЕНИЕ:
Проблема должна быть решена в CUDA 10.1.105 (CUDA 10.1)