我正在使用一个名为 SlideSort
的程序,在使用 GCC 6.3.0 的最新 Debian 系统上不再编译。相反,它会抛出以下错误:
mstree.cpp:228:11: error: no match for ‘operator==’ (operand types are ‘std::ofstream {aka std::basic_ofstream<char>}’ and ‘long int’)
if(dFile==NULL){
^
我不是 C 程序员,我试图通过温和地告诉编译器代码是旧的来绕过这个问题;据我了解,这大致就是 GCC 的选项 -std=c++98
所做的。 (有关 Makefile 的补丁,请参阅 GitHub 的 issue tracker)。
然后代码编译。但它在某些极端情况下会出现段错误(GitHub 的 issue tracker 中提供了测试数据和命令)。当程序使用 GCC 4.9.4 编译时,相同的测试命令工作正常。
因此,将 -std=c++98
传递给 GCC 要么不够,要么完全是错误的想法。是否有替代方法可以在旧系统上编译或将代码更新为最新标准(我自己做不到)?
最佳答案
我不知道为什么这段代码能奏效。在任何版本的 C++ 标准中,标量流对象都无法与整数 或 与 nullptr_t
相媲美。话虽这么说,你的问题不是如何修复你找到的代码,而是如何绕过错误。 我不建议在生产代码中做我将要在这里说的事情。这是一种 hack,它只是为了让像这样的不寻常的库正常工作而设计的。
==
操作符可以在任何类之外定义,作为一个独立的函数。您使用的库将 std::ofstream
与 long int
进行比较。让我们使该比较有效。
bool operator==(const std::ofstream&, long int) {
return false;
}
现在您的代码可以编译了。但它可能会运行不正确。您可以尝试通过检查 std::ofstream
是否为真来使比较更智能。
bool operator==(const std::ofstream& out, long int n) {
return (bool)out == (bool)n;
}
现在它更聪明了。但这里没有 Elixir 。您得到的代码无法正常工作,也不是标准的 C++,因此没有完全可靠的方法可以在不更改实际库代码的情况下使其正常工作。所以我的建议是 fork 存储库并自己修复断行的代码。
关于c++ - 如何完全绕过 `error: no match for ‘operator==’`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47965797/