#include <iostream>
#include <fstream>
using namespace std;
int main () {
ofstream fout = ofstream("fout.txt");
}
此代码使用rgbkrk(使用g ++)的脚本包在原子上可以正常编译,但是当我尝试使用g ++在终端上对其进行编译时,会得到以下输出。不知道我在做什么错。
$ g++ test.cpp -o hw
In file included from test.cpp:1:
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iostream:39:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/streambuf:493:64: error:
base class 'std::__1::ios_base' has private copy constructor
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ios<char>)
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iosfwd:147:32: note:
in implicit copy constructor for 'std::__1::basic_ios<char>' first
required here
class _LIBCPP_TEMPLATE_VIS basic_ofstream;
^
test.cpp:6:19: note: in implicit copy constructor for
'std::__1::basic_ofstream<char, std::__1::char_traits<char> >' first
required here
ofstream fout = ofstream("fout.txt");
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ios:313:5: note:
declared private here
ios_base(const ios_base&); // = delete;
^
1 error generated.
首先,这实际上不是GCC。我知道它看起来是这样,因为您执行了g++
,但是输出表明您使用的是macOS,而在macOS上,g++
实际上是伪装的Clang。是的,这很愚蠢。
第二,在C ++ 17之前,您不能像流一样使用copy-initialisation这样的内容。即使经常删除多余的副本,也总是必须有它们。
所以,而不是:
ofstream fout = ofstream("file.txt");
您应该只写了一个很好的简单声明:
ofstream fout("file.txt");
或:
ofstream fout{"file.txt"};
(ew)
在C ++ 17中,规则已更改,现在省略号为[[强制]],并且不再要求可能的假设副本。因此,在C ++ 17模式下,您的代码应该可以工作。您的手动g++
调用不包含任何打开C ++ 17模式的开关,这显然不是您的Clang版本的默认设置。
始终明确指定所需的语言标准版本。我的转到命令是:
g++ -Wall -Wextra -pedantic -std=c++17 test.cpp -o hw