簡體   English   中英

C ++禁用了復制構造函數,無法創建對象

[英]C++ disabled copy constructor, can't create object

我沒有為我的類提供任何自定義構造函數,我所做的就是禁用復制構造函數:

private:
MyClass(const MyClass& other) = delete; // disable copy ctor

現在,當我嘗試在堆棧上創建此類的實例時

MyClass myInstance;

我得到一個像這樣的編譯錯誤:

main.cpp:16:16: error: no matching function for call to ‘MyClass::MyClass()’

就好像我無意中禁用了默認構造函數一樣? 或許復制構造函數在那里被調用,我只是不知道如何。

這是一個例子

class MyClass {
public:
    int someField;

private:
    MyClass(const MyClass& other) = delete; // disable copy ctor
    MyClass& operator=(MyClass other) = delete; // disable assignment

};

而錯誤

g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++0x -MMD -MP -MF"proj/main.d" -MT"pitch/main.o" -o "proj/main.o" "../proj/main.cpp"
../proj/main.cpp: In function ‘int main()’:
../proj/main.cpp:17:10: error: no matching function for call to ‘MyClass::MyClass()’
  MyClass ins;

問題是你沒有默認構造函數,因此錯誤:

../proj/main.cpp:17:10:錯誤:沒有匹配函數來調用'MyClass :: MyClass()'

您可能會感到困惑,因為在您聲明禁用的復制構造函數之前,您的代碼運行正常。 這是因為編譯器將為沒有已經聲明的構造函數的任何類生成默認構造函數

如果沒有為類類型(struct,class或union)提供任何類型的用戶聲明的構造函數,則編譯器將始終聲明默認構造函數

您需要聲明一個默認構造函數。 從上面的鏈接閱讀( 並由@ user4581301暗示 ):

如果存在一些用戶聲明的構造函數,則用戶仍可強制編譯器自動生成默認構造函數,否則將使用關鍵字default隱式聲明。

這可以這樣做:

class MyClass {
public:
    MyClass() = default;
    int someField;

暫無
暫無

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

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