首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过wofstream打印到文件

通过wofstream打印到文件
EN

Stack Overflow用户
提问于 2020-04-03 11:19:19
回答 2查看 104关注 0票数 1

下面的代码无法工作,并给出了以下编译错误:

严重性代码描述项目文件行抑制状态错误二进制表达式的无效操作数('std::wofstream‘(又名'basic_ofstream >’)

守则是:

代码语言:javascript
复制
template <class T>
void printtofile(std::string filename, int mode, T var, std::wstring msg)
{
    wofstream outfile;
    if (mode == 0) outfile.open(filename); else outfile.open(filename, ios::out | ios::app);
    outfile << msg << L"\n";
    outfile << var << L"\n";
    outfile.close();
}

如果我注释掉下面的一行,没有错误。

代码语言:javascript
复制
    outfile << var << L"\n";

好吧。奇怪和令人困惑的是,如果我按以下方式添加具有不同参数的函数,则不会出现错误,尽管我没有注释掉上面提到的行:

代码语言:javascript
复制
template <class T>
void printtofile(std::string filename, int mode, T var)
{
    wofstream outfile;
    if (mode == 0) outfile.open(filename); else outfile.open(filename, ios::out | ios::app);
    outfile << var << L"\n";
    outfile.close();
}

这不是一回事吗?这里发生什么事情?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-03 11:51:29

如果outfile << var << L"\n";无法编译,这是因为var的类型没有重载,例如:

代码语言:javascript
复制
std::wofstream& operator<<(std::wofstream&, const T&);

例如,如果您试图将一个std::string传递给该函数,这将导致相同的错误。

为了使函数的用户的错误更加清晰,您可以使用SFINAE只实例化受支持类型的模板:

代码语言:javascript
复制
template<class T>
auto printtofile(const std::string& filename, int mode, T var,
                 const std::wstring& msg)
    -> decltype(std::wofstream{} << var, void()) {
//...
}

如果您现在尝试将其用于不受支持的类型,则错误将变成如下所示:

代码语言:javascript
复制
error: no matching function for call to
 ‘printtofile(..., int, <the offending type>, std::wstring&)’
票数 1
EN

Stack Overflow用户

发布于 2020-04-03 12:07:49

对于var类型,需要重载var操作符&对于std::string,可以将其简化为C风格的字符串,并绕过错误。

示例:

outfile<<msg.c_str()<<L"\n";

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61010718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档