通过 wofstream 打印到文件
Print to file via wofstream
下面的代码不起作用并给出编译错误:
Severity Code Description Project File Line Suppression State Error
invalid operands to binary expression ('std::wofstream' (aka 'basic_ofstream >'))
代码是:
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();
}
如果我注释掉下面这行就没有错误了。
outfile << var << L"\n";
好的。奇怪和令人困惑的是,如果我如下添加具有不同参数的函数,则没有错误,尽管我没有注释掉上面提到的行:
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();
}
这不是一回事吗?这是怎么回事?
如果 outfile << var << L"\n";
编译失败,那是因为 var
的类型没有像这样的重载:
std::wofstream& operator<<(std::wofstream&, const T&);
例如,如果您尝试将 std::string
传递给函数,那将导致相同的错误。
为了使函数的用户更清楚错误,您可以使用 SFINAE 仅实例化支持类型的模板:
template<class T>
auto printtofile(const std::string& filename, int mode, T var,
const std::wstring& msg)
-> decltype(std::wofstream{} << var, void()) {
//...
}
如果您现在尝试将它与不受支持的类型一起使用,错误将变成如下内容:
error: no matching function for call to
‘printtofile(..., int, <the offending type>, std::wstring&)’
您需要为 var
类型和 std::string
类型重载 <<
运算符,您可以将其简化为 C 样式字符串并绕过错误。
示例:
outfile<<msg.c_str()<<L"\n";
下面的代码不起作用并给出编译错误:
Severity Code Description Project File Line Suppression State Error invalid operands to binary expression ('std::wofstream' (aka 'basic_ofstream >'))
代码是:
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();
}
如果我注释掉下面这行就没有错误了。
outfile << var << L"\n";
好的。奇怪和令人困惑的是,如果我如下添加具有不同参数的函数,则没有错误,尽管我没有注释掉上面提到的行:
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();
}
这不是一回事吗?这是怎么回事?
如果 outfile << var << L"\n";
编译失败,那是因为 var
的类型没有像这样的重载:
std::wofstream& operator<<(std::wofstream&, const T&);
例如,如果您尝试将 std::string
传递给函数,那将导致相同的错误。
为了使函数的用户更清楚错误,您可以使用 SFINAE 仅实例化支持类型的模板:
template<class T>
auto printtofile(const std::string& filename, int mode, T var,
const std::wstring& msg)
-> decltype(std::wofstream{} << var, void()) {
//...
}
如果您现在尝试将它与不受支持的类型一起使用,错误将变成如下内容:
error: no matching function for call to
‘printtofile(..., int, <the offending type>, std::wstring&)’
您需要为 var
类型和 std::string
类型重载 <<
运算符,您可以将其简化为 C 样式字符串并绕过错误。
示例:
outfile<<msg.c_str()<<L"\n";