c++ - 是什么导致以下错误消息“'ConnectHandler' 的朋友声明与命名空间 'Crafter' 中的任何声明不匹配”?
问题描述
今天,我正在研究一个链接到 libcrafter(版本 0.2)的项目。当我用 g++ (5.4) 构建这个项目时,没有问题。
我正在切换到 clang-8,所以我将 CC 和 CXX 分别设置为 clang、clang++,运行 cmake,然后重新开始构建。
这导致了名义上的错误消息:
friend declaration of 'ConnectHandler' does not match any declaration in the namespace 'Crafter'
/* Rest of the error message, including the following declaration
* friend void* Crafter::ConnectHandler(void *thread_arg), the line and
* column number, filename etc.
*/
对于代码中的另一个函数,我也遇到了同样的错误。Crafter/Utils/TCPConnection.h(第 247、248 行)中指出了错误。
在检查头文件时,我发现了朋友声明:
namespace Crafter
{
class TCPBuffer
{
// Stuff
};
class TCPConnection
{
// Other declarations etc.
friend void* Crafter::ConnectHandler(void *thread_arg);
friend void Crafter::PckHand(Crafter::Packet *sniff_packet, void *user);
// Class declaration continues
};
}
在 TCPConnection.cpp 文件中,我发现:
namespace Crafter
{
void* ConnectHandler(void *thread_arg);
void PckHand(Packet *sniff_packet, void *user);
}
// Intervening code
void Crafter::PckHand(Crafter::Packet *sniff_packet, void *user
{
// Do stuff
}
void* Crafter::ConnectHandler(void *thread_arg)
{
// Do stuff
}
这对我来说看起来不错,而且我基于 g++ 的构建没有任何抱怨。我试图用一个最小的工作示例来重现这一点,但到目前为止我一直无法成功:编译没有错误。
另外需要注意的是,这个错误不是在构建crafter 本身时出现的,而是在构建另一个链接到它的代码时出现的。具体来说,filename.cc
我的项目包含目录中的 TCPConnection.h 文件,这就是编译器指向我的地方。
对于理解此错误并解决它的任何帮助,我将不胜感激。
解决方案
推荐阅读
- mysql - 求和到某个特定值后,如何在 MySQL 中从上到下跳过和检索所有行?
- package - 如何确定自制程序包是否针对苹果 M1 进行了优化
- javascript - 我想在 postgress 中插入一个数组类型的数组,但我不知道如何从节点执行它
- ansible - 证书授权。: 指定的凭据被服务器拒绝
- php - 在 WooCommerce 中选择“本地取货”时,不要对某些产品类别给予折扣
- oracle - 年份的日期差异
- jquery - 如何合并调整大小和滚动功能 - Jquery
- json - 如何使用 jq 从 JSON 日期中提取年份
- python - python中的浮点运算
- plot - 获取 Octave 中的绘图标记和线型列表