C++错误头文件可能无法与C++基文件“|”对话:不是“Plugin::API”的成员

nafvub8i  于 2023-06-07  发布在  其他
关注(0)|答案(2)|浏览(179)

你好,我是C++代码新手。只是让我的脚趾湿我试图建立这个项目在MSVC 2022
我得到生成错误错误C2039“|”:不是“Plugin::API”的成员enc-amf-test
我的问题我的想法是已经在头文件中声明的操作符。为什么我得到上述错误消息,但有此错误作为错误C2593 '操作符<'是模糊的
api-base.hpp

struct Adapter {
        int32_t     idLow, idHigh;
        std::string Name;

        Adapter() : idLow(0), idHigh(0), Name("Invalid Device") {}
        Adapter(const int32_t p_idLow, const int32_t p_idHigh, const std::string& p_Name)
            : idLow(p_idLow), idHigh(p_idHigh), Name(p_Name)
        {}
        Adapter(Adapter const& o) : Name(o.Name), idLow(o.idLow), idHigh(o.idHigh) {}
        void operator=(Adapter const& o)
        {
            idLow  = o.idLow;
            idHigh = o.idHigh;
            Name   = o.Name;
        }

        friend bool operator <(const Plugin::API::Adapter& left, const Plugin::API::Adapter& right);
        friend bool operator >(const Plugin::API::Adapter& left, const Plugin::API::Adapter& right);
        friend bool operator <=(const Plugin::API::Adapter& left, const Plugin::API::Adapter& right);
        friend bool operator >=(const Plugin::API::Adapter& left, const Plugin::API::Adapter& right);

        friend bool operator ==(const Plugin::API::Adapter& left, const Plugin::API::Adapter& right);
        friend bool operator !=(const Plugin::API::Adapter& left, const Plugin::API::Adapter& right);
    };

api-base.cpp

bool Plugin::API::operator<(const Plugin::API::Adapter& left, const Plugin::API::Adapter& right)
{
    if (left == right)
        return left.Name < right.Name;
    else
        return (((uint64_t)left.idLow + ((uint64_t)left.idHigh << 32))
                < ((uint64_t)right.idLow + ((uint64_t)right.idHigh << 32)));
}

当我在Visual Studio 2022社区版中构建这些代码时
我得到错误C2039“|”:不是“Plugin::API”的成员
![正文](https://stackoverf

low.com/image.jpg)
请帮帮我
好吧,我真的要从源代码构建OBS工作室
你在这个链接中找到代码https://github.com/obsproject/obs-amd-encoder/blob/master/source/api-base.cpp

hlswsv35

hlswsv351#

非限定友元声明在全局命名空间中声明友元,而不是在封闭类的命名空间中。
您需要使用完全限定名将它们声明为朋友。

tyky79it

tyky79it2#

您遇到的错误似乎表明<操作符未被识别为Plugin::API命名空间的成员。此错误可能是由于头文件和实现文件中的命名空间不匹配。
api-base.cpp文件中,您将在Plugin::API命名空间中定义operator<函数。但是,根据您提供的代码片段,似乎Adapter结构体和相关的操作符是在api-base.hpp文件中的任何名称空间之外定义的。
要解决此问题,需要确保api-base.cpp文件也知道相同的名称空间。以下是如何修改代码:
api-base.hpp:

namespace Plugin {
namespace API {
    struct Adapter {
        // ... Adapter definition ...
    };

    // Declare operator< inside the Plugin::API namespace
    bool operator<(const Adapter& left, const Adapter& right);
} // namespace API
} // namespace Plugin

api-base.cpp:

#include "api-base.hpp"

namespace Plugin {
namespace API {
    // Define operator< inside the Plugin::API namespace
    bool operator<(const Adapter& left, const Adapter& right) {
        // ... implementation ...
    }
} // namespace API
} // namespace Plugin

通过将operator<定义包含在相同的名称空间(Plugin::API)中,可以确保它与头文件中的声明匹配并解决错误。
确保对其他操作符定义(例如,operator>operator<=等)应用相同的修改,如果它们也打算成为Plugin::API命名空间的一部分。
请注意,您提供的代码似乎是一个更大项目的一部分,因此您可能需要相应地调整代码库其余部分的更改。

相关问题