簡體   English   中英

ofstream in class - 嘗試引用已刪除的函數

[英]ofstream in class - attempting to reference a deleted function

我在類中有一個成員變量,其類型是ofstream以及一個包含字符串參數的構造函數:

class dogs
{
public:
    ofstream dogsFile;

    dogs(string location)
    {

    }
};

出現以下錯誤:

錯誤2錯誤C2280:'std :: basic_ofstream> :: basic_ofstream(const std :: basic_ofstream>&)':嘗試引用已刪除的函數c:\\ users \\ pc \\ documents \\ visual studio 2013 \\ projects \\ database \\ database \\ database.cpp 26 1數據庫

我再次嘗試了這個代碼,但我沒有使用字符串,而是使用了char *:

class dogs
{
public:
    ofstream dogsFile;

    dogs(char* location)
    {

    }
};

錯誤消失了。 為什么? 為什么字符串會出錯?

編輯:這是整個代碼:

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>

using namespace std;


class dogs
{ 
    ofstream dogsFile;

public:
    dogs(string location)
    {

    }
};

int main(int argc, _TCHAR* argv[])
{
    dogs dog = dogs("dog.bin");
    return 1;
}

迪特的原始答案似乎是正確的。 即這將編譯:

dogs *dog = new dogs("dog.bin");

你的行不會,看到他關於復制構造函數的答案。

狗(“dog.bin”)將創建一個對象,然后“=”將復制它並將其交給狗。 無法復制帶有ofstream的對象。

你也可以通過使用來解決這個問題

dogs dog("dog.bin");

代替。

除了VC ++中的錯誤之外,我無法想到這一點。

定義dogs類的方式,編譯器應該為它生成一個隱式移動構造函數,它將調用std::ofstream的移動構造函數,它被定義為C ++ 11

何時定義隱式移動構造函數的規則在[12.8 / 9]和[12.8 / 11]的標准中規定。 他們也在這里列出。 在這種情況下,我看不出有任何理由不聲明隱式移動構造函數。

然后,行

dogs dog = dogs("dog.bin");

必須調用從右手邊的臨時dogs對象到左手邊dog的移動(可以省略移動,但構造器仍然需要可訪問)。

簡而言之,一切都應該正常。

而它在Clang 3.5中也是如此。 它在GCC中不起作用,但僅僅因為它沒有為流類定義的移動構造函數(在這方面它不符合標准)。

有趣的是,它適用於VC ++,正如OP正式提到的,如果dogs構造函數被聲明除了std::string的任何其他東西。 將構造函數更改為以下任何一個:

dogs(const string& location)

要么

dogs(int a) //And change the call accordingly, of course.

要么

dogs(A a) //And change the call accordingly (A is a user-defined class).

一切都會在VC ++中正常工作,應該如此。

事實上,它不僅適用於通過值傳遞的std::string ,這似乎表明編譯器中存在錯誤。 基本上,在這種情況下,只有在這種情況下,編譯器決定不定義隱式移動構造函數,這會導致復制初始化回退到調用復制構造函數,從而導致錯誤。

如果你明確定義了移動構造函數,就像這樣:

dogs(dogs&& arg) : dogsFile(std::move(arg.dogsFile)) { }

再一次,一切正常,包括構造函數按值獲取std::string

我看不出VC ++以這種方式表現的任何正當理由。

暫無
暫無

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

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