【发布时间】:2018-01-09 16:01:44
【问题描述】:
无法在 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;
}
我是这样编译的:g++ test.cpp 并且得到了这个:
test.cpp:12:11: 错误:类型的无效操作数 'std::ofstream(std::__cxx11::string) {aka std::basic_ofstream(std::__cxx11::basic_string)}' 和 ‘const char [2]’ 转二进制 ‘operator
可能是什么原因?
【问题讨论】:
-
ofstream iriFile(string(fileName));是一个函数声明,请参见 Most Vexing Parse。现在没有时间寻找最好的欺骗,但一般来说,编译器可以警告你。 wandbox.org/permlink/tgimOpyhXGcD1Spu -
那是很多轮子旋转;就说
ofstream iriFile("test"); -
SO 中有不少关于最令人头疼的解析的帖子。见stackoverflow.com/search?q=%5Bcpp%5D+most+vexing+parse。问题的症结在于
ofstream iriFile(string(fileName));被解析为ofstream iriFile(string fileName);,这只是一个函数声明。 -
如果您无法找出错误,通常值得同时使用 GCC 和 Clang 进行测试:警告:括号作为函数声明已消除歧义 [-Wvexing-parse]