Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 CUDA 8.0:命名空间中模板友元的编译错误_C++11_Templates_Compiler Errors_Cuda_Nvcc - Fatal编程技术网

C++11 CUDA 8.0:命名空间中模板友元的编译错误

C++11 CUDA 8.0:命名空间中模板友元的编译错误,c++11,templates,compiler-errors,cuda,nvcc,C++11,Templates,Compiler Errors,Cuda,Nvcc,我注意到以下代码是用g++/clang++-3.8编译的,但不是用nvcc编译的: #include//未使用,只是为了确保我们有c++11 #包括 名称空间a{ 模板 X类{ 朋友T; }; } 我得到以下编译错误: /usr/local/cuda-8.0/bin/nvcc -std=c++11 minimum_cuda_test.cu nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprec

我注意到以下代码是用g++/clang++-3.8编译的,但不是用nvcc编译的:

#include//未使用,只是为了确保我们有c++11
#包括
名称空间a{
模板
X类{
朋友T;
};
}
我得到以下编译错误:

/usr/local/cuda-8.0/bin/nvcc -std=c++11 minimum_cuda_test.cu
nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future release (Use -Wno-deprecated-gpu-targets to suppress warning).
minimum_cuda_test.cu:7:10: error: ‘T’ in namespace ‘::’ does not name a type
   friend T;
有趣的是,这适用于nvcc:

#include//未使用,只是为了确保我们有c++11
#包括
模板
X类{
朋友T;
};

这是编译器中的错误吗?我以为nvcc会在内部使用g++或clang作为编译器,所以我不明白为什么它可以与我的本地编译器一起工作,而不能与nvcc一起工作。

在这两种情况下,代码都是由g++编译的。但是,当将.Cu文件传递给NVCC时,它会将代码通过CUDA C++前端传递给主机编译器。查看带有GCC4.8的CUDA8,我发现代码已经从

namespace a {
template<class T>
class X {
  friend T;
};
}
名称空间a{
模板
X类{
朋友T;
};
}

名称空间a{
模板
X类{
朋友:T;
};

你可以看到前端用一个等价的替代了模板朋友,但是有一个预先准备好的匿名命名空间,它正在破坏编译。我不是C++语言的律师,但这在CUDA前端是一个错误。我建议把它报告给Nvidia。< /P>我明白,这将解释它。我能看到CUDA C++前端的输出吗?@ MatthaspReGrn:你可以通过<代码> -v保持到NVCC,这将告诉你编译过程中发生错误的地方和正在处理哪个输入文件,然后自己检查输入文件。

namespace a {
template< class T>
class X {
friend ::T;
};