bemerkte mich, dass der folgende Code kompiliert mit g ++/Klirren ++ - 3.8 aber nicht mit nvcc:CUDA 8.0: Fehler beim Kompilieren mit Vorlage Freund in Namespace
#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;
};
}
erhalte ich den folgenden Compiler-Fehler:
/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;
Interessanterweise funktioniert dies mit nvcc:
#include <tuple> // not used, just to make sure that we have c++11
#include <stdio.h>
template<class T>
class X {
friend T;
};
Ist das ein Bug im Compiler? Ich dachte, nvcc würde intern g ++ oder clang als Compiler verwenden, daher bin ich verwirrt, warum das mit meinem lokalen Compiler funktionieren würde, aber nicht mit nvcc.
Ich sehe, das würde es erklären. Nebenbei bemerkt: Wie kann ich die Ausgabe des CUDA C++ Frontends sehen? –
@MatthiasSpringer: Sie können '-v --keep' an nvcc übergeben, das Ihnen anzeigt, wo im Kompilierungsprozess der Fehler aufgetreten ist und welche Eingabedatei verarbeitet wurde, und dann diese Eingabedatei selbst überprüfen. – talonmies