你好,我是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
2条答案
按热度按时间hlswsv351#
非限定友元声明在全局命名空间中声明友元,而不是在封闭类的命名空间中。
您需要使用完全限定名将它们声明为朋友。
tyky79it2#
您遇到的错误似乎表明
<
操作符未被识别为Plugin::API
命名空间的成员。此错误可能是由于头文件和实现文件中的命名空间不匹配。在
api-base.cpp
文件中,您将在Plugin::API
命名空间中定义operator<
函数。但是,根据您提供的代码片段,似乎Adapter
结构体和相关的操作符是在api-base.hpp
文件中的任何名称空间之外定义的。要解决此问题,需要确保
api-base.cpp
文件也知道相同的名称空间。以下是如何修改代码:api-base.hpp:
api-base.cpp:
通过将
operator<
定义包含在相同的名称空间(Plugin::API
)中,可以确保它与头文件中的声明匹配并解决错误。确保对其他操作符定义(例如,
operator>
、operator<=
等)应用相同的修改,如果它们也打算成为Plugin::API
命名空间的一部分。请注意,您提供的代码似乎是一个更大项目的一部分,因此您可能需要相应地调整代码库其余部分的更改。