C++ 带有gcc7的NVCC错误

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

我有下面的代码,它只有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: 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_;
};