2011-02-11 48 views
0

初始化结构的内容我有一个结构:无法访问地图

typedef struct 
{ 
    Qt::Key qKey; 
    QString strFormType; 
} 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.... 

当前,我调用一个使用这些KeyPair的函数。

​​

我愿把所有这些密钥对实例的地图,这样我就不必调用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]); 

此代码块不工作... :(有人可以告诉我如何正确地把这些密钥对中一个Map?

+0

这就是`pressKeyPairs`的定义,你的编译错误是什么? – 2011-02-11 07:51:11

+1

你得到的编译器错误是什么?另外,我的猜测是pressKeyPairs()得到一个const KeyPair&但你使用的是一个迭代器而不是一个const_iterator(因为它应该可以做,因为它更“正确”) – gnobal 2011-02-11 07:51:57

+0

编译器错误:没有匹配函数`pressKeyPairs(KeyPair&)' – Owen 2011-02-11 08:02:38

回答

1

我认为Henning的答案是要走的路。
*gDial*gIP代表的意思是gDial[0]gIP[0]
因此,只需将KeyPair阵列的第一个元素插入mMasterList即可。

您的pressKeyPairs的声明 template<size_t nNumOfElements> void pressKeyPairs(KeyPair(&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); 
    } 
} 

希望这有助于。

0

尝试添加Q_DECLARE_METATYPE(KeyPair)在您的typedef声明并且还调用qRegisterMetaType(“KeyPair”);之前使用KeyPair结构实例。

1

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