【问题标题】:Unable to access contents of initialized struct in a map无法访问映射中已初始化结构的内容
【发布时间】:2011-02-11 07:43:57
【问题描述】:

我有一个结构:

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 放入 Map 中吗?

【问题讨论】:

  • 那是pressKeyPairs的定义,你的编译错误是什么?
  • 您遇到的编译器错误是什么?另外,我的猜测是 pressKeyPairs() 得到一个 const KeyPair& 但你使用的是迭代器而不是 const_iterator (无论如何你应该这样做,因为它“更正确”)
  • 编译器错误:没有匹配函数调用`pressKeyPairs(KeyPair&)'

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


【解决方案1】:

我认为 Henning 的回答是正确的方法。
*gDial*gIP 在您的代码中的意思是 gDial[0]gIP[0]
因此,您只将KeyPair 数组的第一个元素插入mMasterList

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

希望这会有所帮助。

【讨论】:

  • @Owen:很高兴能帮上忙 :-)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 您不需要将某些内容放入 QMap。
    猜你喜欢
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    相关资源
    最近更新 更多