在尝试用 == 比较一个模板函数时,没有能匹配这两个操作数的运算符
我在尝试比较一个返回变体的模板函数(C++):
while (parserUtils::isBinary(lookAhead.value) && parserUtils::comparePrecedence<lookAheadToken, Token>(lookAhead, op) == lookAhead)
Intellisense抛出错误:
no operator "==" matches these operands
模板函数:
template <typename T, typename U = T>
std::variant<T, U> comparePrecedence(T token_1, U token_2)
{
Precedence token_1_precedence = getPrecedence(token_1.value);
Precedence token_2_precedence = getPrecedence(token_2.value);
if (token_2_precedence > token_1_precedence)
{
return token_2;
}
else if (token_2_precedence == token_1_precedence)
{
return NULL;
}
else
{
return token_1;
}
}
LookAhead和 op的声明如下:
lookAheadToken lookAhead;
Token op;
我对模板还挺新鲜的,因此欢迎给出反馈。
解决方案
你将一个 std::variant 与一个具体类型进行比较,这是错误的根本原因。
你的函数返回:
std::variant<T, U>
因此这个表达式:
parserUtils::comparePrecedence<lookAheadToken, Token>(lookAhead, op) == lookAhead
尝试进行求值:
std::variant<lookAheadToken, Token> == lookAheadToken
在 std::variant 与 lookAheadToken 之间没有定义 operator==,因此错误为:
没有运算符 "==" 能匹配这些操作数
std::variant 不会隐式地将自己与其备选项之一进行比较。即使底层值匹配,你也必须显式地提取它。
另外,你的函数包含:
return NULL;
这对 std::variant 来说是无效的,并且会带来进一步的问题(除非其中一个备选项是指针类型,或者你显式使用 std::monostate,否则它不能表示 NULL)。
在比较之前,必须从变体中提取值:
auto result = parserUtils::comparePrecedence<lookAheadToken, Token>(lookAhead, op);
if (std::holds_alternative<lookAheadToken>(result) &&
std::get<lookAheadToken>(result) == lookAhead)
{
// ...
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。