1 智能感知:不能将 "StatementTable::StatementFunc" 类型的值分配给类型 "StatementTable::StatementState" 的实体

1 IntelliSense: a value of type "StatementTable::StatementFunc" cannot be assigned to an entity of type "StatementTable::StatementState"

本文关键字:类型 StatementTable 分配 StatementState 实体 智能 不能 StatementFunc 感知      更新时间:2023-10-16

StatementStateFunction[]是返回StatementState的函数数组,StateArray [GetInputToken(T)] [CurrentState]是一个状态表,告诉StatementStateFunction[]调用哪个函数,然而编译器说它不能将StatementFunc分配给StatementState,即使在StatementStateFunction[]中调用的方法都返回一个StatementState

在StatementTable.cpp

void StatementTable::BuildStatement (Token & T)
{
  StatementState CurrentState (StartStatement);
  do
  {
    CurrentState = StatementStateFunction [ StateArray[GetInputToken(T)][CurrentState] ];
  } 
  while (CurrentState != StatementComplete);
}
在StatementTable.h

typedef StatementState          (*StatementFunc)    (Token &);
static  Token::UChar        StateArray [NumTokeInputs] [NumberStates]; 
static  StatementFunc       StatementStateFunction  [];

让我们分析一下这个表达式:

CurrentState = StatementStateFunction [ StateArray[GetInputToken(T)][CurrentState] ];

这里有三个数组索引,GetInputToken(T), CurrentState, StateArray[x][y]。数组索引必须是整数(int, short, char, long等)。

  • GetInputToken似乎是一个函数。从你的源代码,我不能告诉它是否返回一个整型或不。
  • CurrentState类型为StatementState。不清楚该类型是什么,但如果它不是整型,也没有隐式转换到这种类型,则不能用作数组索引。
  • StateArray[x][y]类型为Token::UChar。这应该没问题,UChar看起来像一个整型的类型定义。

表达式剩下的是赋值操作。它的形式是CurrentState = StatementStateFunction[x]StatementStateFunction[x]是一个StatementFunc,即一个函数指针。CurrentState的类型为StatementState不能将函数指针赋值给StatementState ,至少错误消息是这样说的。

我假设您想要调用该函数,可能将Token作为参数给定给BuildStatement。使代码更易于阅读,看起来像这样:

void StatementTable::BuildStatement (Token & T)
{
  StatementState CurrentState = StartStatement;
  do
  {
    auto tokenIndex = GetInputToken(T);
    auto funcIndex = StateArray[tokenIndex][CurrentState];
    auto function = StatementStateFunction[funcIndex];
    //this is what was missing: the function call
    CurrentState = function(T);
  } 
  while (CurrentState != StatementComplete);
}