[英]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.