CUDA 8.0:命名空间中的模板朋友编译错误
CUDA 8.0: Compile Error with Template Friend in Namespace
我注意到以下代码使用 g++/clang++-3.8 编译但不使用 nvcc:
#include <tuple> // not used, just to make sure that we have c++11
#include <stdio.h>
namespace a {
template<class T>
class X {
friend 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 <tuple> // not used, just to make sure that we have c++11
#include <stdio.h>
template<class T>
class X {
friend T;
};
这是编译器中的错误吗?我认为 nvcc 会在内部使用 g++ 或 clang 作为编译器,所以我很困惑为什么这适用于我的本地编译器而不适用于 nvcc。
在这两种情况下,代码都是由 g++ 编译的。但是,当您将 .cu 文件传递给 nvcc 时,它会将代码通过 CUDA C++ 前端,然后再传递给主机编译器。使用 gcc 4.8 查看 CUDA 8,我看到代码已从
namespace a {
template<class T>
class X {
friend T;
};
}
到
namespace a {
template< class T>
class X {
friend ::T;
};
您可以看到前端已将模板化友元替换为等效项,但带有前置匿名命名空间,这会破坏编译。我不是 C++ 语言律师,但在我看来,这似乎是 CUDA 前端中的一个错误。我建议向 NVIDIA 报告。
我注意到以下代码使用 g++/clang++-3.8 编译但不使用 nvcc:
#include <tuple> // not used, just to make sure that we have c++11
#include <stdio.h>
namespace a {
template<class T>
class X {
friend 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 <tuple> // not used, just to make sure that we have c++11
#include <stdio.h>
template<class T>
class X {
friend T;
};
这是编译器中的错误吗?我认为 nvcc 会在内部使用 g++ 或 clang 作为编译器,所以我很困惑为什么这适用于我的本地编译器而不适用于 nvcc。
在这两种情况下,代码都是由 g++ 编译的。但是,当您将 .cu 文件传递给 nvcc 时,它会将代码通过 CUDA C++ 前端,然后再传递给主机编译器。使用 gcc 4.8 查看 CUDA 8,我看到代码已从
namespace a {
template<class T>
class X {
friend T;
};
}
到
namespace a {
template< class T>
class X {
friend ::T;
};
您可以看到前端已将模板化友元替换为等效项,但带有前置匿名命名空间,这会破坏编译。我不是 C++ 语言律师,但在我看来,这似乎是 CUDA 前端中的一个错误。我建议向 NVIDIA 报告。