2

私は C++ にかなり慣れていないので、ここで何が起こっているのかを正確に理解しようとしています。(他の誰かの) コードをコンパイルしようとしています。mingw を使用すると正常に動作しますが、組み込みシステム (TS-7800) にクロスコンパイルしていて、コンパイラ エラーが発生しています。どうにか mingw が const との自動マッチングを行っているように見えますが、クロスコンパイラはそうではありませんが、何が起こっているのか正確にはわかりません。

コードは次のとおりです。

typedef ::zmq::context_t ZeroMQContextType;
typedef boost::shared_ptr<ZeroMQContextType> ZeroMQContextHandleType;
typedef ::zmq::socket_t ZeroMQSocketType;
typedef boost::shared_ptr<ZeroMQSocketType> ZeroMQSocketHandleType;

SocketFactory::ZeroMQSocketHandleType SocketFactory::createZmqSocket(
    ZeroMQContextHandleType const & contextHandle, int const & zmqSocketType) {

    ZeroMQSocketHandleType socketHandle;

    switch (zmqSocketType) {
    case ZMQ_PUB:
        socketHandle = boost::make_shared<ZeroMQSocketType>(*contextHandle, ZMQ_PUB);
        // other stuff

    // etc ...
    }
return socketHandle;

}

そして、私が得ているエラー:

/path/include/boost/smart_ptr/make_shared_object.hpp: In function `typename boost::detail::sp_if_not_array<T>::type boost::make_shared(const A1&, const A2&) [with T = zmq::socket_t, A1 = zmq::context_t,
SocketFactory.cpp:42:   instantiated from here
/path/include/boost/smart_ptr/make_shared_object.hpp:743: error: no matching function for call to `zmq::socket_t::socket_t(const zmq::context_t&, const int&)'
/path/include/zmq.hpp:395: note: candidates are: zmq::socket_t::socket_t(const zmq::socket_t&)
/path/include/zmq.hpp:278: note:                 zmq::socket_t::socket_t(zmq::context_t&, int)

関数から s を削除しようとしましたconstが、 に引数を渡すとすぐに追加されるようmake_sharedです。

  1. 誰かがこのエラーで何が起こっているのか説明できますか? そしてなぜ mingw はこのコードに問題がないのでしょうか? (VS10および標準のgccでもうまく機能したと思います)。
  2. 適切な説明に失敗した場合、どうすればこの問題を修正して次のエラーに進むことができますか?

ありがとう!

4

1 に答える 1

2

OK、のドキュメントを読むmake_sharedと解決します。C++0x サポートが検出された場合、明らかに参照make_sharedのみを渡します。const

http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/make_shared.html#functions

示されているように、パラメーターをラップしboost::refて非 const に渡すことができます。

于 2013-06-03T20:36:58.437 に答える