C++ Can';在GNULinuxC++;错误:流和‘;常量字符[2]’;到二进制‘;操作人员

C++ Can';在GNULinuxC++;错误:流和‘;常量字符[2]’;到二进制‘;操作人员,c++,linux,c++11,fstream,C++,Linux,C++11,Fstream,无法在Linux上编译此小代码: #include <fstream> #include <string> #include <iostream> #include <stdio.h> using namespace std; int main(){ char fileName[512]; sprintf(fileName, "test"); ofstream iriFile(string(fileName)); i

无法在Linux上编译此小代码:

#include <fstream>
#include <string>
#include <iostream>
#include <stdio.h>
using namespace std;
int main(){
    char fileName[512];
    sprintf(fileName, "test");
    ofstream iriFile(string(fileName));
    iriFile<<",";
    return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
字符文件名[512];
sprintf(文件名,“测试”);
流文件(字符串(文件名));

iriFileOk,解决方案是删除隐式字符串()创建:

string sFileName(fileName)
ofstream iriFile(sFileName);

正如您所指出的,删除显式字符串创建可以修复它

值得一提的是,对于具有
显式
构造函数的类型,也可以使用如下方法修复此问题:

ofstream iriFile(string{sFileName});

首先,您不需要显式地将
const char*
转换为
std::string
它有
std::ifstream
构造函数:

 std::ofstream iriFile(fileName);

但是如果你想要额外的安全和冗长,使用适当的C++:那么:

std::ofstream iriFile( static_cast<std::string>(fileName) );
std::ofstream-iri文件(静态_-cast(文件名));

不是C风格的强制转换。

流iriFile(字符串(文件名));
是一个函数声明,请参阅最烦人的解析。现在没有时间寻找最好的副本,但一般来说,编译器可以警告您。非常相关:这是一个很大的旋转;只需说
流iriFile(“测试”)
关于最麻烦的解析主题,SO中有不少帖子。请参阅。问题的关键在于流iriFile(string(fileName))的
被解析为流iriFile(string fileName)的
,这只是一个函数声明。如果您无法找出错误,通常值得使用GCC和Clang进行测试:警告:括号作为函数声明消除歧义[-Wvexing parse]我想您的意思是“显式”字符串创建。只要它不需要你的讨厌的转换就传递它,如果你想玩的安全,使用C++的演员,而不是CIt,因为我不是一个母语是英语的人,像“代码>明确的< /代码>和<>代码>含蓄的< /代码>让我有点困惑。所以我只是抄袭了这个单词,因为我想这就是我想说的。纠正它。