用于创建指向成员函数的指针的语法

时间:2013-12-28 14:13:51

标签: c++

我正在尝试编译一个使用指向(非静态)成员函数的指针的旧代码,但它不会编译,因为语法现在不同了。我只能通过输入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
}

3 个答案:

答案 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;

调用此类函数,您需要以下语法(假设barBar*):

(bar->*function)(42);

或(如果barBar):

(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;
}