在尝试用 == 比较一个模板函数时,没有能匹配这两个操作数的运算符

编程语言 2026-07-09

我在尝试比较一个返回变体的模板函数(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::variantlookAheadToken 之间没有定义 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章