0

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

1 に答える 1

0

この式を分析してみましょう。

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

ここには 3 つの配列インデックスがありますGetInputToken(T), CurrentState, StateArray[x][y]。配列インデックスは整数 ( intshort、など)charである必要があります。long

  • GetInputToken関数のようです。ソースからは、整数型を返すかどうかわかりません。
  • CurrentStateタイプStatementStateです。その型が何であるかは明確ではありませんが、整数型でなく、そのような型への暗黙的な変換がない場合は、配列インデックスとして使用できません。
  • StateArray[x][y]タイプToken::UCharです。Thyt は問題ないはずUCharです。整数型の typedef のように見えます。

式の残りは代入です。の形をしてい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);
} 
于 2013-05-15T06:49:33.277 に答える