C++ 带有gcc7的NVCC错误
我有下面的代码,它只有cuda9+gcc7有一个错误。Cuda9+gcc6没有编译错误 这是我为错误编写的最小复制器。我怀疑这是一个编译器错误,但我必须修复我的代码才能使用gcc7。我想知道一个解决编译错误的方法 Cuda编译工具,9.2版,V9.2.148 gcc版本7.3.0(Ubuntu 7.3.0-21ubuntu1~16.04) 错误:C++ 带有gcc7的NVCC错误,c++,cuda,nvcc,C++,Cuda,Nvcc,我有下面的代码,它只有cuda9+gcc7有一个错误。Cuda9+gcc6没有编译错误 这是我为错误编写的最小复制器。我怀疑这是一个编译器错误,但我必须修复我的代码才能使用gcc7。我想知道一个解决编译错误的方法 Cuda编译工具,9.2版,V9.2.148 gcc版本7.3.0(Ubuntu 7.3.0-21ubuntu1~16.04) 错误: $ nvcc test.cu test.h: In constructor 'TestOp::TestOp()': test.h:6:54: erro
$ nvcc test.cu
test.h: In constructor 'TestOp::TestOp()':
test.h:6:54: error: 'Dummy' is not a member of 'TestOp'
//op.h
class OperatorBase {
public:
template <typename T>
inline bool Dummy(T default_value) {
return true;
}
};
template <class Context>
class Operator : public OperatorBase {
};
//测试h
#include "op.h"
template <class Context>
class TestOp : public Operator<Context> {
public:
TestOp()
: msg_(
OperatorBase::Dummy<bool>(true)) {}
private:
bool msg_;
};
#包括“op.h”
模板
类TestOp:公共操作符{
公众:
TestOp()
:msg_(
OperatorBase::Dummy(true)){}
私人:
bool味精;
};
<代码> > P> CUDA 9.2 NVCC C++前端对代码进行这样的操作:
class OperatorBase {
public:
template< class T> bool
Dummy(T default_value) {
return true;
}
};
template< class Context>
class Operator : public OperatorBase {
};
template< class Context>
class TestOp : public Operator< Context> {
public:
TestOp()
: msg_(
this->OperatorBase::template Dummy< bool> (true)) { }
private:
bool msg_;
};
类运算符数据库{
公众:
模板bool
虚拟(T默认值){
返回true;
}
};
模板<类上下文>
类运算符:公共运算符数据库{
};
模板<类上下文>
类TestOp:public操作符{
公众:
TestOp()
:msg_(
this->OperatorBase::template Dummy(true)){
私人:
bool味精;
};
似乎g++-7(只有g++-7或更高版本)在编译代码时名称查找失败。我不知道C++的原因,为什么它实际上应该失败。我可以说这不是CUDA前端的新行为——我测试过的CUDA 9和CUDA 8的每个版本都会发出相同的代码
通过以不同的方式实现名称解析,可以避免这种情况:
template <class Context>
class TestOp : public Operator<Context> {
public:
TestOp()
: msg_(
//OperatorBase::Dummy<bool>(true)) {}
this->template Dummy<bool>(true)) {}
private:
bool msg_;
};
模板
类TestOp:公共操作符{
公众:
TestOp()
:msg_(
//OperatorBase::Dummy(true)){}
此->模板伪(真)){}
私人:
bool味精;
};
虽然这有点老派,但它使用CUDA 9.2和gcc-4.8、gcc-5.4和gcc-7编译。如果这个->
太冒犯了您的敏感度,那么您可以尝试使用别名来解决第三个问题。CUDA 9有多个版本。nvcc--version
的输出是什么?适合我。错误消息似乎与问题中的代码无关。我已使用cuda版本更新了我的问题@RobertCrovellaI将在这里冒险说这实际上是一个gcc错误,而不是CUDA的问题。Clang、MSVC和gcc7之前的每个gcc版本都可以正确编译工具链在这种情况下发出的代码
template <class Context>
class TestOp : public Operator<Context> {
public:
TestOp()
: msg_(
//OperatorBase::Dummy<bool>(true)) {}
this->template Dummy<bool>(true)) {}
private:
bool msg_;
};