2

私は最初の問題のほとんど (と思われるもの) をうまく処理することができましたが、私の回答の一部は他の人の (未回答の) 質問から得られたものであるため、正しい方向に向かっているかどうかはわかりません。ブーストのミュータブル キューを使用していますが、コンパイル時に問題が発生しています。

私のコードは、現状では次のとおりです。

typedef struct _MyComparator 
{
    bool operator() (const PriorityStruct* arg1, const PriorityStruct* arg2) const
    {
        return arg1->key < arg2->key; 
    }
} MyComparator;

class PriorityQueue
{
    typedef PriorityStruct* entry;
    typedef boost::typed_identity_property_map<entry> prop_map; 
    typedef boost::mutable_queue<entry, std::vector<entry>, MyComparator, prop_map> priority_queue_notAmb;
    priority_queue_notAmb* pq;
    boost::mutex mut;
public:
    PriorityQueue(void);
}

PriorityQueue::PriorityQueue()
{
    pq = new priority_queue_notAmb(sizeof(entry)*2, MyComparator(), prop_map());
    PriorityStruct* ps = new PriorityStruct;
    pq->push(ps);
}

最後の行 pq->push(ps) を削除すると、新しい PriorityQueue タイプの作成時にコードがコンパイルおよび実行されます。そのままでは、コンパイルできないエラーが発生します。

そして、私のエラーは次のとおりです。

1>------ Build started: Project: PriorityQueue, Configuration: Debug x64 ------
1>  PriorityQueue.cpp
1>C:\boost\boost\pending\mutable_queue.hpp(94): error C2679: binary '[' : no operator found which takes a right-hand operand of type 'PriorityQueue::entry ' (or there is no acceptable conversion)
1>          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\vector(1119): could be 'const unsigned __int64 &std::vector<_Ty>::operator [](unsigned __int64) const'
1>          with
1>          [
1>              _Ty=size_t
1>          ]
1>          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\vector(1135): or       'unsigned __int64 &std::vector<_Ty>::operator [](unsigned __int64)'
1>          with
1>          [
1>              _Ty=size_t
1>          ]
1>          while trying to match the argument list '(std::vector<_Ty>, PriorityQueue::entry )'
1>          with
1>          [
1>              _Ty=size_t
1>          ]
1>          C:\boost\boost\pending\mutable_queue.hpp(91) : while compiling class template member function 'void boost::mutable_queue<IndexedType,RandomAccessContainer,Comp,ID>::push(const IndexedType &)'
1>          with
1>          [
1>              IndexedType=PriorityQueue::entry,
1>              RandomAccessContainer=std::vector<PriorityQueue::entry>,
1>              Comp=MyComparator,
1>              ID=PriorityQueue::prop_map
1>          ]
1>          PriorityQueue.cpp(7) : see reference to function template instantiation 'void boost::mutable_queue<IndexedType,RandomAccessContainer,Comp,ID>::push(const IndexedType &)' being compiled
1>          with
1>          [
1>              IndexedType=PriorityQueue::entry,
1>              RandomAccessContainer=std::vector<PriorityQueue::entry>,
1>              Comp=MyComparator,
1>              ID=PriorityQueue::prop_map
1>          ]
1>          PriorityQueue.cpp(5) : see reference to class template instantiation 'boost::mutable_queue<IndexedType,RandomAccessContainer,Comp,ID>' being compiled
1>          with
1>          [
1>              IndexedType=PriorityQueue::entry,
1>              RandomAccessContainer=std::vector<PriorityQueue::entry>,
1>              Comp=MyComparator,
1>              ID=PriorityQueue::prop_map
1>          ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

使用方法に関してこれに関する多くの情報を見つけることができなかったので、どんな助けでも大歓迎です.

編集:追加のテストとして、追加しました

cout << (pq->empty() ? "YES" : "NO") << endl;

何か奇妙なことが起こっていないかどうかを確認します。毎回「YES」と出力されます。pq->push をこれに置き換えましたが、読みやすくするために別の方法で行うようにとのコメントが 1 つか 2 つ届かない限り、これを更新されたメモとして保持します。

4

0 に答える 0