для класса x не существует конструктора по умолчанию, оператор новое наследование

0

Я пытался реализовать пример Unified Vidrtual Memory, указанный в блоге CUDA: http://devblogs.nvidia.com/parallelforall/unified-memory-in-cuda-6/

Visual Studio 2013 дает мне ошибку: конструктор по умолчанию для класса "Термин" не существует,

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <stdio.h>
#include <iostream>

#define NUM_ATTRIBUTES 10

class Managed {
public:
    void *operator new(size_t len) {
      void *ptr;
      cudaMallocManaged(&ptr, len);
      std::cout << "custom new for size " << len << '\n';
      return ptr;
    }
    void *operator new[] (size_t len) {
      void *ptr;
      cudaMallocManaged(&ptr, len);
      std::cout << "custom new for size " << len << '\n';
      return ptr;
    }
    void operator delete(void *ptr) {
        cudaFree(ptr);
    }
};

class Attribute : public Managed {
public:
    int num_levels;
    int num_active_levels;
    int active_levels;
};

class Term : public Managed {
public:
    int num_active_attributes;
    int active_attributes;
    Attribute attribute[NUM_ATTRIBUTES];

    // Unified memory copy constructor allows pass-by-value
    Term (const Term &orig) {
        num_active_attributes = orig.num_active_attributes;
        active_attributes = orig.active_attributes;
        cudaMallocManaged((void **)&attribute,NUM_ATTRIBUTES * sizeof(Attribute));
        memcpy(attribute, orig.attribute, NUM_ATTRIBUTES * sizeof(Attribute));
    }
};

int main()
{
    Term * A = new Term[10];
    getchar();
    return 0;
}

Разве класс Term не наследуется от нового оператора, определенного в родительском классе Managed?

Теги:
constructor

2 ответа

1
Лучший ответ

Это не связано с CUDA. Компилятор не создает конструктор по умолчанию, потому что вы уже предоставили другой конструктор (копия).

Просто явно запросите конструктор по умолчанию:

class Term : public Managed {
public:
    ...

    // C++11
    Term() = default;

    // Pre C++11 alternative (although not strictly equivalent)
    Term() {}
    ...
};

Также обратите внимание, что operator new и конструкторы - это две разные вещи: new - для выделения хранилища, конструкторы - для инициализации этого хранилища в значимое состояние (примерно).

  • 0
    Большое спасибо. Я предполагаю, что это не поддерживается в Visual Studio 2012 и появилось только в VS2013. ошибка: неверно сформированный чистый спецификатор (допускается только "= 0"). К сожалению, CUDA не поддерживается VS 2013. Есть ли альтернатива?
  • 0
    @RemiDav это C ++ 11?
Показать ещё 2 комментария
0

Вам необходимо определить конструктор по умолчанию, необходимый для элементов массивов

class Term : public Managed {
public:
    //...
    Term () {}  // default c-tor
    Term() = default;  // since C++11, note however that there are some 
                       // differences between Term() = default; and Term() {}
                       // they are not equal when value initialization 
                       // is considered
};

У вас его нет, потому что явно определенный экземпляр-ctor Term( const Term&) запретил генерировать конструктор по умолчанию компилятором. Что касается различий между =default и {} в терминах конструктора по умолчанию, вы можете посмотреть на это:

qaru.site/questions/43679/...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню