簡體   English   中英

類x不存在默認構造函數,運算符新繼承

[英]no default constructor exists for class x, operator new inheritence

我正在嘗試實施CUDA博客上給出的統一虛擬內存示例: http ://devblogs.nvidia.com/parallelforall/unified-memory-in-cuda-6/

Visual Studio 2013給我一個錯誤:類“ Term”不存在默認構造函數

#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中定義的新運算符繼承嗎?

這與CUDA無關。 編譯器不會生成默認構造函數,因為您已經提供了另一個構造函數(副本1)。

只是顯式地請求默認構造函數:

class Term : public Managed {
public:
    ...

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

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

還要注意, operator new和構造函數是兩個不同的東西: new用於分配存儲,構造函數用於存儲初始化為有意義的狀態(大致)。

您需要定義數組元素所需的默認構造函數

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
};

您沒有一個,因為顯式定義的copy-ctor Term( const Term&)禁止編譯器生成默認構造函數。 關於默認構造函數方面=default{}之間的區別,您可以看一下:

https://stackoverflow.com/a/23698999/1141471

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM