Невозможно получить доступ к содержимому инициализированной структуры в карте - PullRequest
0 голосов
/ 11 февраля 2011

У меня есть структура:

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

Теперь я инициализирую экземпляры KeyPair, чтобы использовать его для своего приложения Automated Test.

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 () сто раз ... Я новичок в использовании 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]); 

Этот блок кода не работает ... :( Кто-нибудь может подсказать, как правильно разместить эти пары ключей на карте?

Ответы [ 3 ]

1 голос
/ 11 февраля 2011

То, что вы делаете, не так уж и плохо.Вы получаете ошибку компилятора только потому, что компилятор не знает, как вывести ваш массив структур в cout, поэтому, если вы просто выводите (* it) .first и перебираете элементы (* it). За секунду у вас все будет хорошо,Однако обратите внимание, что вам нужно как-то убедиться, что вы знаете количество записей в каждом из таких массивов.Это может быть достигнуто, например, всегда имея какую-либо пустую запись в качестве последней (или соглашение, что escape-ключ всегда является последней записью или что-то в этом роде)

1 голос
/ 11 февраля 2011

Я думаю, что ответ Хеннинга - путь.
*gDial и *gIP в вашем коде означают gDial[0] и gIP[0].
Таким образом, вы вставляете только первый элемент массива KeyPair в mMasterList.

Ваша pressKeyPairs декларация template<size_t nNumOfElements> void pressKeyPairs(KeyPair(&keys)[nNumOfElements]); само по себе правильно. В качестве аргумента используется ссылка на массив KeyPair.
Однако, поскольку mMasterList s second_type является KeyPair (не * массив 1018 *), pressKeyPairs((*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 );
  }
}

Надеюсь, это поможет.

0 голосов
/ 11 февраля 2011

Попробуйте добавить Q_DECLARE_METATYPE (KeyPair) после вашего объявления typedef, а также вызовите qRegisterMetaType ("KeyPair"); перед использованием KeyPair экземпляров структуры.

...