【发布时间】:2012-04-13 02:13:34
【问题描述】:
我有两个具有以下签名的重载成员函数:
class MyClass
{
void f(int, int, int);
void f(int, int, int, double);
};
我使用 boost::bind 如下:
boost::bind(&MyClass::f, _1, 1, 2, 3); // _1 is a placeholder for the implicit parameter
我的问题其实是没有问题。根据 boost::bind 文档(http://www.boost.org/doc/libs/1_49_0/libs/bind/bind.html#err_overloaded),这应该“通常”导致错误,我应该需要转换为函数指针类型。但是我的代码编译没有错误,并且似乎按预期运行。
文档中给出的示例是重载函数的唯一区别是一个是 const 而另一个不是。因此,我的猜测是我没有问题,因为编译器可以分辨出两个重载函数之间的区别,因为参数的数量(和类型)不同,而在文档的示例中没有办法编译器通过传递给 boost::bind 的参数来告诉你想要哪个版本。另一方面,我对我的猜测持怀疑态度,因为我质疑编译器如何知道在我的示例中传递给 boost::bind 的最后 3 个参数链接到第一个参数中的函数指针(因此构成其签名的一部分) - 在我看来,这是 boost::bind 的内部问题,编译器应该不知道。
我在谷歌上搜索这个问题时找不到的文档和任何其他建议都没有说明只有具有相同参数类型的重载函数存在问题。因此,在我开始依赖我的代码(可能是错误的)有效假设之前,如果有人能确认我的猜测是正确的(并且暗示,为什么我的怀疑是错误的),我将不胜感激。我担心的是编译器只是根据我不打算的推理来选择要绑定的函数,例如选择它遇到的第一个。
【问题讨论】:
-
什么编译器可以让您在不消除歧义的情况下执行
&MyClass::f? -
您是否在目的上使用古老的工具集? ;-]
-
在这种情况下,
std::bind附带的版本可能会作为您需要的未来版本的功能。 ;-] 不过老实说,我不能足够强调标准库在 VC++ 2010 中的改进程度。我理解并同情对成本的担忧,但是考虑到 Express 版本没有提供您需要的什么你还是使用 Qt 而不是 MFC? -
不只是功能,想想在 7 年左右的时间里修复了多少错误。
-
Express 不附带 Windows SDK 或x64 编译器,但可以通过安装Windows SDK 轻松解决。 :-]