2012-12-04 21 views
0

我試圖構建一個名爲Setop的類,該類提供set操作,包括交集,union等。所以我嘗試使用C++模板來實例化它。在Setop中,我使用QSet來存儲集合的元素。我的代碼如下所示:使用模板與QSet和Qt中的boost :: tuples :: tuple無匹配錯誤

setop.h

template <typename T> class SetOp { 
    public: 
     SetOp(std::vector<T> &_input); 
void _union(SetOp<T> &_set2); 
    QSet<T> _intersection(SetOp<T> &_set2); 
    QSet<T> _diff(SetOp<T> &_set2); 
    QSet<T> _diff(QSet<T> &_set1,QSet<T> &_set2); 
    void outputElement(); 
    QSet<T> getSet(){return mySet;} 
    std::vector<T> getVecFromQSet(); 
    private: 
     QSet<T> mySet; 
    }; 

setop.cpp:

template <typename T> SetOp<T>::SetOp(std::vector<T> &_input) 
{ 
    for(int i = 0; i < (int)_input.size(); ++i) 
     mySet.insert(_input[i]); 
} 

這裏是我試過了,我傳遞的boost ::元組::使用模板類元組到Setop:

void MainWindow::setOp(std::vector<std::vector<boost::tuples::tuple<float,int,int,int> > > &_pointSet) 
    { 
     std::vector<std::vector<boost::tuples::tuple<float,int,int,int> > > merged; 
     while(!_pointSet.empty()) { 
      BOOST_AUTO(it,_pointSet.begin()); 
      BOOST_AUTO(itn,_pointSet.begin() + 1); 
      SetOp<boost::tuples::tuple<float,int,int,int> > set1((*it)),set2((*itn)); 
      for(; itn != _pointSet.end();) { 
       //   SetOp<boost::tuples::tuple<float,int,int,int> > temp = set1; 
//   if(!temp._intersection(set2).isEmpty()) { 
//    set1._union(set2); 
//    itn = _pointSet.erase(itn); 
//   } 
//   else 
//    ++itn; 
      } 
//  merged.push_back(set1.getVecFromQSet()); 
     } 
    } 

編譯器生成以下錯誤:

c:\QtSDK\Desktop\Qt\4.8.1\mingw\include\QtCore\qhash.h:882: error:no matching function for call to 'qHash(const boost::tuples::tuple<float, int, int, int, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>&)' 
c:\QtSDK\Desktop\Qt\4.8.1\mingw\include\QtCore\qhash.h:225: error:no match for 'operator==' in 'key0 == ((QHashNode<boost::tuples::tuple<float, int, int, int, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>, QHashDummyValue>*)this)->QHashNode<boost::tuples::tuple<float, int, int, int, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>, QHashDummyValue>::key' 

這些錯誤意味着什麼以及如何糾正它們?

+0

相關:http://stackoverflow.com/questions/9126470/how-to-write-qhash-for-a-qsetsomeclass-container –

+0

@VaughnCato boost :: tuples :: tuple中有一個float值。對於浮點值很難實現operator ==,不是嗎? – user957121

+0

不使用QSet,然後...使用std集合或boost集合。另外,爲什麼SetOp.intersection(SetOp)返回一個QSet?它有點不一致... – UmNyobe

回答

1

From doc

的展示Qset類是一個模板類,它提供了一個基於哈希表集。
...
在內部,QSet被實現爲QHash。

QHash內的任何值應同時定義

operator==(const T& other) 
uint qHash (const T * key)