0

並べ替えられたベクトルの番号のインデックスを作成する必要があります。そして、異なるフィールドで比較された T * のセットを作成します。

これはコンパイルできません: bool Comparator::operator ()(const valType &,const valType &) const: 「const POI &」の「POI *const」から型キャストを行うことはできません。

POI には、label(std::string)、type(uint) の 2 つのフィールドがあります。

template <typename FieldType, typename valType, FieldType valType::*iMember>
class Comparator
{
public:
    bool operator()(valType const& iLeft, valType const& iRight) const {
        return iLeft->*iMember > iRight->*iMember;
    }
};

template< class ValType, class CompType, typename FieldType >
class SearchIndex
{
public:
    SearchIndex() {}
    void Build( std::vector< ValType > iElems, std::ofstream & oStream )
    {
        std::map< ValType *, size_t > numbersOfElems;

        for( std::vector< ValType >::iterator it = iElems.begin(); it != iElems.end(); ++it){
            m_elems.insert( &(*it));
            numbersOfElems.insert(std::pair< ValType * , size_t>( &(*it),5));
        }

        oStream << m_elems.size();
        for( std::multiset< ValType * >::iterator it = m_elems.begin(); it!= m_elems.end(); ++it )
            oStream << numbersOfElems[*it] << " " ;
    }

private:
    std::multiset< ValType * , CompType > m_elems;
};

main.cpp

int main(int argc, char *argv[])
{
    std::vector< POI > testVect;

    POI sec( "Gas", 1 );
    testVect.push_back(sec);
    POI th( "Tryy", 3 );
    testVect.push_back(th);

    std::ofstream oStream;
    oStream.open("Index.dat",std::ofstream::app | std::ofstream::binary | std::ofstream::out );

    typedef Comparator<std::string, POI, &POI::m_label> POIbyLabel;

    SearchIndex< POI, POIbyLabel, std::string> testIndex;

    testIndex.Build( testVect, oStream );
}
4

1 に答える 1

0

&(*it) は SearchIndex のタイプ "POI *" ですが、Comparator の受け入れパラメーターは "const POI"(valType const&); です。m_elems.insert(*it); を使用してみてください。

于 2013-08-25T14:55:46.093 に答える