Я нахожусь в Visual Studio 2013 и пытаюсь скомпилировать код CUDA, который использует наследование и C++ 11. Приведенный ниже код возвращает ошибку «модификатор не допускается при деструкторе» из-за «переопределения».Ошибка «модификатор не допускается при деструкторе» при компиляции с помощью nvcc в VS2013
// derived.cuh
class derived : public base
{
public:
derived();
~derived() override;
};
где деструктор базового класса является виртуальным. Точный же код компилируется на Ubuntu. Точно такой же код также компилируется с помощью компилятора Visual Studio C++ по умолчанию, если я изменяю .cu и .cuh на .cpp и .h. C++ 11 включен, потому что, если «переопределение» добавляется к нормальной функции, оно также отлично компилируется. См. Пример ниже,
// derived2.cuh
class derived2 : public base
{
public:
derived2();
~derived2();
void func() override;
};
где func() является виртуальной функцией в базовом классе.
Как избавиться от ошибки «модификатор не допускается при деструкторе» при компиляции с помощью nvcc в VS2013?
@AndyG "' override' указывает, что вы хотите, чтобы метод вызывался при доступе от указателя базового класса или ссылки «Нет,' virtual' делает это. 'override' просто сообщает компилятору, что он должен анализировать, действительно ли метод (подпись/перегрузка) переопределяет предыдущую базовую« виртуальную »функцию (т. е. случайно не создает функцию _new_ overrid_able_' virtual') и выдаёт ошибку, если нет, улавливать случайные опечатки и т. д. Это не влияет на то, как функция используется, если она успешно скомпилирована. –
VS2015 принимает спецификатор переопределения на деструкторе. Ваши варианты должны обновиться или отбросить 'override' на деструкторе. Не знаете, что еще вы можете сделать. – Praetorian
@Praetorian Я думаю, что это должна быть проблема nvcc, потому что я могу добавить переопределение на деструкторах для обычных классов .cpp и .h, и он компилируется отлично. Я попытаюсь заполучить VS2015 и протестировать его с помощью nvcc и посмотреть, как это происходит: – user3667089