1 IntelliSense:“StatementTable :: StatementFunc”类型的值不能分配给“StatementTable :: StatementState”类型的实体

时间:2013-05-15 05:23:22

标签: c++ visual-studio-2012

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  [];

1 个答案:

答案 0 :(得分:0)

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

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

这里有三个数组indizes,GetInputToken(T), CurrentState, StateArray[x][y]。数组indizes必须是整数(intshortcharlong等。

  • GetInputToken似乎是一个功能。从你的来源我无法判断它是否返回一个整数类型。
  • CurrentState的类型为StatementState。目前尚不清楚该类型是什么,但如果它不是整数类型,也没有隐式转换为这种类型,则不能用作数组索引。
  • StateArray[x][y]的类型为Token::UChar。你应该没问题,UChar看起来像一个整数类型的typedef。

表达的剩余部分是作业。它的格式为CurrentState = StatementStateFunction[x]StatementStateFunction[x]StatementFunc,即函数指针。 CurrentState的类型为StatementState您无法将该函数指针指定给StatementState ,至少这是错误消息所说的内容。

我假设您想调用该函数,可能将令牌作为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);
}