1

我的编译器错误非常长,因为 g++ 告诉我我使用错误的函数的许多“候选人”。我能做些什么?

server.cpp:78:51: note: candidates are:
/usr/include/boost/asio/buffer.hpp:599:26: note: boost::asio::mutable_buffers_1  boost::asio::buffer(const boost::asio::mutable_buffer&)
/usr/include/boost/asio/buffer.hpp:599:26: note:   candidate expects 1 argument, 2 provided
... 30 lines of error for one wrong line of code
4

1 回答 1

4

C++ 是一种优秀的重量级编程语言,但没有人想出如何让它发出可读的错误消息。恐怕您提到的错误消息很复杂,因为从编译器的角度来看,错误很复杂。如果您花时间仔细阅读该信息,并想一想,您可能会开始理解为什么必须如此。

让我们分解您的错误消息:

server.cpp:78:51: note: candidates are:

这意味着错误似乎起源于server.cpp 的第 78 行(或者是第 51 行?)。 但是,编译器认为这是错误的原因是在 Boost 标头asio/buffer.hpp 中找到的。 检查该标头可能是徒劳的,因为标头可能既复杂又正确。尽管如此,错误消息的下一行从 Boost 标头中提取了您需要的信息:

note: boost::asio::mutable_buffers_1  boost::asio::buffer(const boost::asio::mutable_buffer&)

所以,回到server.cpp 的第 78 行,你调用了boost::asio::buffer(),对吗?作为括号之间的参数,该函数需要一个类型为 的对象boost::asio::mutable_buffer。你给了一个吗?如果是,你确定吗?显然,出于某种原因,编译器不会将您的参数识别为具有正确的类型。

现在让我们看一下错误的第三行:

note:   candidate expects 1 argument, 2 provided

所以,实际上,回到server.cpp 的第 78 行,你给boost::asio::buffer(). 也就是说,你调用boost::asio::buffer(x, y)了而不是boost::asio::buffer(x)-- 或者,如果你没有调用,编译器会认为你调用了。

跟踪这些步骤。他们应该解决你的问题。

有关信息,我经常收到占满一半或更多屏幕的 C++ 错误消息。我不像你那样喜欢它们,但我确实理解编译器为什么会发出它们。当库功能被滥用时,C++ 强大的模板工具尤其会产生一些相当严重的错误消息。这是语言的本质。如果一个人会用 C++ 编程,那么除了让自己适应这种性质外,几乎什么都做不了。

于 2012-06-28T01:37:15.443 回答