0

私は構造体を持っています:

typedef struct
{
    Qt::Key qKey;
    QString strFormType;
} KeyPair;

次に、KeyPair のインスタンス化を初期化して、Automated Test App で使用できるようにします。

KeyPair gDial[] =
{
    { Qt::Key_1 , "MyForm" },
    { Qt::Key_1 , "SubForm" },
    { Qt::Key_Escape, "DesktopForm" }
};

KeyPair gIP[] =
{
    { Qt::Key_1 , "MyForm" },
    { Qt::Key_2 , "Dialog" },
    { Qt::Key_2 , "Dialog" },
    { Qt::Key_Escape, "DesktopForm" }
};
....
and like 100 more instantiations....

現在、これらのキーペアを使用する関数を呼び出しています。

qDebug() << "Testing Test Menu"; 
pressKeyPairs( gDial);

qDebug() << "Testing Browse Menu"; 
pressKeyPairs( gIP);
....
and more calls like this for the rest... 

これらすべての KeyPair インスタンス化を MAP に入れたいので、pressKeyPairs() と qDebug() を 100 回呼び出す必要はありません...私は MAPS を使用する初心者です...だから私は試しました:

map<string,KeyPair> mMasterList;
map<string,KeyPair>::iterator it;   

mMasterList.insert( pair<string, KeyPair>("Testing Test Menu", *gDial) ); //which I know is wrong, but how?
mMasterList.insert( pair<string, KeyPair>("Testing IP Menu", *gIP) );
mMasterList.insert( pair<string, KeyPair>("IP Menu2", *gIP2) );
....

for ( it=mMasterList.begin() ; it != mMasterList.end(); it++ )
{
   qDebug() << (*it).first << endl;
   pressKeyPairs((*it).second);       
   // I don't know how to access .second ... this causes a compiler error
}

編集: pressKeyPairs は次のように宣言されます。

template <size_t nNumOfElements> void pressKeyPairs(KeyPair (&keys)[nNumOfElements]); 

このコード ブロックは機能していません... :( これらのキーペアをマップに適切に配置する方法を誰か教えてもらえますか?

4

3 に答える 3

1

結局のところ、あなたがしていることはそれほど間違っていません。コンパイラが構造体の配列を cout に出力する方法を知らないという理由だけで、コンパイラ エラーが発生しています。そのため、(*it).first を出力して (*it).second の要素を反復処理するだけであれば問題ありません。 . ただし、そのような配列のそれぞれのエントリ数を何らかの方法で確認する必要があることに注意してください。これは、たとえば、常に最後のエントリとして何らかの種類の null エントリを保持することによって実現できます (または、エスケープ キーが常に最後のエントリなどであるという規則)。

于 2011-02-11T07:52:22.270 に答える
1

ヘニングの答えは行くべき道だと思います。
*gDialあなたのコードではandを*gIP意味gDial[0]しますgIP[0]
したがって、KeyPair配列の最初の要素のみを に挿入しmMasterListます。

あなたpressKeyPairsの宣言 template<size_t nNumOfElements> void pressKeyPairs(KeyPair(&keys)[nNumOfElements]); 自体は正しいです。KeyPair配列への参照を引数として取ります。
ただし、は(配列ではない) ため、 mMasterList型の不一致エラーが発生します。second_typeKeyPairKeyPairpressKeyPairs((*it).second)

以下のアイデアはいかがですか?

  • 配列KeyPairArrayを指す型を作るKeyPair
  • pressKeyPairsへの参照を取ります KeyPairArray

例えば:

struct KeyPairArray {
  size_t nNumOfElements;
  KeyPair *keys;

  template< size_t N >
  KeyPairArray( KeyPair(&k)[ N ] ) : nNumOfElements( N ), keys( k ) {}
};

// Example
void pressKeyPairs( KeyPairArray const& keys )
{
  for ( size_t i = 0;  i < keys.nNumOfElements;  ++ i ) {
    qDebug()<< keys.keys[ i ].qKey <<','<< keys.keys[ i ].strFormType <<'\n';
  }
}

int main() {
  map<string,KeyPairArray> mMasterList;
  map<string,KeyPairArray>::iterator it;
  mMasterList.insert(
    make_pair( "Testing Test Menu", KeyPairArray( gDial ) ) );

  for ( it=mMasterList.begin() ; it != mMasterList.end(); it++ ) {
    pressKeyPairs( it->second );
  }
}

お役に立てれば。

于 2011-02-11T15:11:27.717 に答える
0

typedef 宣言の後にQ_DECLARE_METATYPE(KeyPair)を追加し、qRegisterMetaType("KeyPair");も呼び出してみてください。KeyPair構造体インスタンスを使用する前。

于 2011-02-11T07:51:59.947 に答える