(boost:: && std::) 绑定仅在参数太少的 MSVC 上失败

Posted

技术标签:

【中文标题】(boost:: && std::) 绑定仅在参数太少的 MSVC 上失败【英文标题】:(boost:: && std::) bind fails only on MSVC with too few arguments 【发布时间】:2015-08-12 14:59:37 【问题描述】:

编辑:最小化代码示例

#include <iostream>
#include <functional>
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <Wt/WServer>

Wt::WApplication *createApplication(const Wt::WEnvironment& env, int i) 
    return new Wt::WApplication(env);


int main(int argc, char** argv)

    Wt::WRun(argc, argv,boost::bind(&createApplication, _1, 1));

错误 94 错误 C2198: 'Wt::WApplication *(__cdecl *)(const Wt::WEnvironment &,int)' : 调用的参数太少 \wt-3.3.4-msvs2013-windows-x86-sdk\包括\提升\功能\function_template.hpp 95 1

同样失败,Wt::WRun(argc, argv,std::bind(&amp;createApplication, std::placeholders::_1, 1)); 出现完全相同的错误。


老例子

我正在使用库Wt,它有一个函数Wt::WRun(),它接受一个函数作为第三个参数,在本例中是application_creator,它返回一个指向Wt 类型的指针并接受一个参数。到现在为止还挺好。这个函数是用户提供的,可能需要更多参数,我这样做了,还有一个 lib 显示的 example(参见 main.c,Wt::WSever::addEntryPoint 采用与 WRun 相同的参数)。

所以我想像示例中那样绑定我的附加参数。我的解决方案可以使用 gcc/mingw 完美编译,但使用 MSVC/Visual Studio 2013 Express 时会失败并出现错误

错误 94 错误 C2198: 'Wt::WApplication *(__cdecl *)(const Wt::WEnvironment &,int)' : 调用的参数太少 ...include\boost\function\function_template.h

我的电话:Wt::WRun(argc, argv,boost::bind(MDDB_Service::application_creator, _1, 5));

回调Wt::WApplication* MDDB_Service::application_creator(const Wt::WEnvironment&amp; env, int foo);的定义

WT::WRun的定义:

#define WTCONNECTOR_API __declspec(dllimport)
typedef boost::function<WApplication* (const WEnvironment&)> ApplicationCreator;
int WTCONNECTOR_API WRun(int argc, char** argv,
            ApplicationCreator createApplication = 0);

Wt::WRun(argc, argv,std::bind(MDDB_Service::application_creator, std::placeholders::_1, 5));也一样

错误 94 错误 C2198: 'Wt::WApplication *(__cdecl *)(const Wt::WEnvironment &,int)' : 调用的参数太少 ... include\boost\function\function_template.hpp

【问题讨论】:

MDDB_Service::application_creator 的签名是什么? 抱歉忘记了,我是通过编辑添加的。谢谢! 什么是“Visual Studio 2013 Essentials” 对不起应该改名为“快递” application_creator 是成员函数吗? 【参考方案1】:

问题其实不是编译器的错,而是这一行:

Wt::WEnvironment we();  

它声明了一个名为 we 的函数,不接受任何参数并返回 Wt::WEnvironment。您正在成为the most vexing parse 的受害者。 用

替换该行
Wt::WEnvironment we;  

应该可以解决您的问题。

【讨论】:

Facepalm 我把那行改成Wt::WEnvironment we;,但并没有解决问题,但它似乎揭示了真实的东西:Wt::WEnvironment 的默认构造函数受到保护,所以我猜受限制的构造场景会阻止任何有用的绑定,例如即使我绑定的函数可以访问构造函数,因为任何转换都是不可能的?! @Superlokkus 根据您的说法,它确实解决了您的问题,但确实揭示了另一个问题。你仍然可以进行绑定,你只需要想办法获得一个有效的Wt::WEnvironment 实例。 确实,如果你说这就是绑定失败的原因,它解决了我的问题的一部分,我将其用作对 Wt 库开发人员的影响,因为他们鼓励这种用例。

以上是关于(boost:: && std::) 绑定仅在参数太少的 MSVC 上失败的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 std::vector 初始化 boost::random::discrete_distribution?

是否可以使用 boost.any 作为 std::map 中的键(或类似的东西)?

Boost python,将原始指针与托管指针进行比较?

boost::const 和 non-const 的变体

Boost:创建对象并使用线程填充向量

使用 std::bind 占位符和 boost 库的问题