我有以下代码,只有cuda9 + gcc7才有错误。 Cuda9 + gcc6没有编译错误。
这是我为该错误编写的最少的复制程序。我怀疑这是编译器错误,但我必须修复代码才能与gcc7一起使用。我想知道一种解决方法,以摆脱编译错误。
Cuda编译工具,版本9.2,V9.2.148
gcc版本7.3.0(Ubuntu 7.3.0-21ubuntu1〜16.04)
错误:
var MissionTwoSets = db.Setalets
.Where(x => x.Bolum == 2 && x.SetId==setAlet.SetId)
.Include(x => x.Aletler.AletAD)
.Include(x => x.Setler)
.AsEnumerable() // <-- switch to LINQ to Objects
.GroupBy(x => x.SetId)
.ToList();
// op.h
$ nvcc test.cu
test.h: In constructor 'TestOp::TestOp()':
test.h:6:54: error: 'Dummy' is not a member of 'TestOp'
// test.cu
class OperatorBase {
public:
template <typename T>
inline bool Dummy(T default_value) {
return true;
}
};
template <class Context>
class Operator : public OperatorBase {
};
// test.h
#include "test.h"
答案 0 :(得分:2)
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_;
};
在编译该代码时,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_;
};
虽然这有点老套,但可以使用CUDA 9.2和gcc-4.8,gcc-5.4和gcc-7进行编译。如果using
冒犯了您的敏感性,您可能会尝试基于this->
别名的第三种解决方案。