无法访问地图中初始化结构的内容

时间:2011-02-11 07:43:57

标签: c++ qt data-structures map multimap

我有一个结构:

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

现在我初始化KeyPair实例化,以便将其用于我的自动化测试应用程序。

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....

目前,我调用了一个使用这些KeyPairs的函数。

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

此代码块无效...... :(有人可以告诉我如何将这些KeyPairs正确放入地图中吗?

3 个答案:

答案 0 :(得分:1)

你所做的事情毕竟不是那么错。你只是因为编译器不知道如何将你的结构数组输出到cout而得到编译器错误,所以如果你只输出(* it).first并迭代(* it)的元素。第二你应该没问题。但请注意,您需要确保知道每个此类数组中的条目数。这可以通过例如总是将某种空条目作为最后一个条目(或者转义密钥始终是最后一个条目或其他任何条件的约定)来实现。

答案 1 :(得分:1)

我认为亨宁的答案是要走的路 代码中的*gDial*gIP表示gDial[0]gIP[0] 因此,您只将KeyPair数组的第一个元素插入mMasterList

您的pressKeyPairs声明 template<size_t nNumOfElements> void pressKeyPairs(KeyPair(&keys)[nNumOfElements]); 本身是正确的。它引用KeyPair数组作为参数 但是,由于mMasterList second_typeKeyPair(不是KeyPair数组), 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 );
  }
}

希望这有帮助。

答案 2 :(得分:0)

尝试在typedef声明后添加 Q_DECLARE_METATYPE(KeyPair),并在使用 KeyPair 结构实例之前调用 qRegisterMetaType(“KeyPair”);