首页 > 解决方案 > 是什么导致以下错误消息“'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 文件,这就是编译器指向我的地方。

对于理解此错误并解决它的任何帮助,我将不胜感激。

标签: c++g++clang++libcrafter

解决方案


推荐阅读