编译器特定错误:无法将函数与 const 参数匹配

Posted

技术标签:

【中文标题】编译器特定错误:无法将函数与 const 参数匹配【英文标题】:Compiler-specific error: can't match function with const arguments 【发布时间】:2013-06-03 20:23:07 【问题描述】:

我对 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)

我已尝试从函数中删除 consts,但看起来在将参数传递给 make_shared 时它们会被重新添加。

    谁能向我解释这个错误是怎么回事?以及为什么 mingw 对这段代码没有问题? (我相信它在 VS10 和标准 gcc 上也能正常工作)。 没有很好的解释,我该如何解决这个问题并进入下一个错误?

谢谢!

【问题讨论】:

【参考方案1】:

好的,事实证明阅读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 参数匹配的主要内容,如果未能解决你的问题,请参考以下文章

MFC CFileDialog派生类在编译过程出现“error 没有与参数列表匹配的构造函数......”的问题

CUDA模板错误:没有函数模板的实例与参数列表匹配

const

临时变量作为非const的引用进行参数传递引发的编译错误

Typescript 编译器错误 - 提供的参数与调用目标的任何签名都不匹配

为啥将“float**”转换为“const float**”时出现错误?