【问题标题】:Print to file via wofstream通过 wofstream 打印到文件
【发布时间】:2020-07-15 13:17:50
【问题描述】:

以下代码不起作用并给出以下编译错误:

严重性代码描述项目文件行抑制状态错误 二进制表达式的无效操作数 ('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();
}

这不是一回事吗?这是怎么回事?

【问题讨论】:

  • @Ted Lyngmo 在编译第一行代码时出错:outfile
  • 为了更清楚,我做了一个答案。

标签: c++ file printing wofstream


【解决方案1】:

如果outfile &lt;&lt; var &lt;&lt; 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&)’

【讨论】:

  • 非常感谢您的回答。复制对我来说是另一个问题。我正在做。关于这一行: outfile
  • 不客气!通过添加main() 来重现它,您可以在其中使用导致编译错误的变量调用您的函数。我怀疑您没有在问题中披露完整的错误消息。它应该显示类型,因此将其完整复制/粘贴到问题中。如果另一个函数成功了,那么你在调用那个函数时没有使用相同的类型。
  • 你是对的。我没有粘贴整个错误消息,因为我认为它不相关。但是复制代码后,我明白它与它有关。我使用犰狳进行矩阵运算,它会产生问题。但是,如果我使用 ofstream 而不是 wofstream,它不会产生错误。
  • @KC_ 我认为您可能在代码中混合了不易转换的类型 - 但我不确定,因为您还没有说清楚.编写一个小程序来提出问题,然后用minimal reproducible example 提出另一个问题,人们通常会跳起来。
  • 是的,你又是对的;我一起使用了 wstring 和 string 类型。我意识到 wofstream 不会打印特殊的 unicode 字符。现在我将 wstring 转换为 utf8 字符串并改用 ofstream。
【解决方案2】:

对于var 类型,您需要重载&lt;&lt; 运算符,对于std::string,您可以将其缩减为C 样式字符串并绕过错误。

例子:

outfile&lt;&lt;msg.c_str()&lt;&lt;L"\n";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-25
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 2014-12-21
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多