我正在尝试编译一个使用指向(非静态)成员函数的指针的旧代码,但它不会编译,因为语法现在不同了。我只能通过输入Foo
来创建一个指向函数&Bar::Foo
的指针,这种情况并非如此(只需键入Foo
即可创建成员指针)。
这个语法是什么时候添加的,有没有办法允许VisualStudio中的旧语法避免修改旧代码?
这是一个随机的例子,使用编译:
class Foo
{
public:
int Bar(int x)
{
return x + 2;
}
Foo();
};
int (Foo::*f)(int);
Foo::Foo()
{
f = Bar; // error, have to use f = &Foo::Bar now
}
答案 0 :(得分:3)
您没有在问题中指定,但每当我听到“语法不同”时,我假设您正在从Visual C ++ 6迁移到较新版本的Visual Studio。
它的长短是; Visual C ++ 6不使用“符合标准的C ++”。从Visual C ++ 6迁移到任何其他现代编译器将导致许多语法错误,并将花费一些精力迁移到“合规性”。你只需要搞砸它并进行语法更改。
关闭手;我没有资源支持我,但我愿意打赌你的函数指针语法属于这一类。
好消息是;一旦你完成了它,世界上所有其他现代编译器几乎都会使用符合标准的代码,所以你只需要这样做一次。
<强>更新强>
我做了一个快速搜索,发现在least one source,这似乎证实了MSVC6的行为:
“有些编译器(最着名的是MSVC 6和7)会让你省略&amp;,即使它是非标准和令人困惑的。更符合标准的编译器(例如,GNU G ++和MSVC 8(又名VS 2005) )要求它,所以你一定要把它放进去。“
答案 1 :(得分:1)
不,您必须使用符合标准的语法来创建和调用成员函数指针。 VC ++ 6更慷慨;例如当你想创建一个函数指针时,你不需要命名它所在的类,除非模糊不清;这在标准C ++中根本不可能。
成员函数的类型指向
之类的函数int Bar::Foo(int x);
是
int (Bar::*)(int)
并使用名称(例如此类型的变量或参数):
int (Bar::*function)(int)
创建成员函数指针 以使用&符号运算符:
function = &Bar::Foo;
要调用此类函数,您需要以下语法(假设bar
为Bar*
):
(bar->*function)(42);
或(如果bar
是Bar
):
(bar.*function)(42);
或(如果bar
是实施Bar
的{{1}}智能指针):
operator*
答案 2 :(得分:1)
以下可能会有所帮助:
class A
{
public:
void foo();
};
int main(int argc, char* argv[])
{
void (A::*mem_func)() = &A::foo;
A a;
(a.*mem_func)();
return 0;
}