如何获取MSVC中的成员函数指针?

我不会深入Excel的细节,我基本上从这个例子的代码:

C ++应用程序自动化Excel(CppAutomateExcel)
solution1.cpp

所以我已经在MSVC中试过这个代码,它编译:

class foo { public: virtual void bar(){} }; int main() { void (foo::*p)() = &foo::bar; } 

但是在Excel中捕获移动函数地址的类似代码不起作用:

 int main() { Excel::_ApplicationPtr spXlApp; HRESULT hr = spXlApp.CreateInstance(__uuidof(Excel::Application)); Excel::WorkbooksPtr spXlBooks = spXlApp->Workbooks; Excel::_WorkbookPtr spXlBook = spXlBooks->Add(); Excel::_WorksheetPtr spXlSheet = spXlBook->ActiveSheet; HRESULT(Excel::_Worksheet::*pMove)(...) = &spXlSheet->Excel::_Worksheet::Move; <... irrelevant code ...> return 0; } 

这有以下编译器错误:

错误C2276:'&':绑定成员函数expression式的非法操作

如果我删除& ,它说我应该加回来:

错误C3867:'Excel :: _Workheet :: Move':非标准语法; 使用'&'来创build一个指向成员的指针

任何帮助在这里做什么将不胜感激。

你需要像这样声明方法指针:

 // or whatever parameter type Move() actually uses... void (Excel::_Worksheet::*pMove)(tagVARIANT, tagVARIANT) = &Excel::_Worksheet::Move; 

然后,实际调用pMove() ,你将不得不这样做:

 Excel::_WorksheetPtr spXlSheet = ...; (spXlSheet.Get()->*pMove)(...); 

你在你的问题中说“但类似的代码…”然后你显示代码,你不做同样的事情。 尝试使用相同的语法来设置pMove就像用于在较小示例中设置p 。 试试类似于&Excel::_Worksheet::Move; (没有“spXlSheet->”)。

如果您可以指定在您设置函数指针时为其调用函数指针的对象的特定实例,那么我不知道这样的function。 在从设置variables的地方删除spXlSheet->之后,将其replace为您要调用函数指针的位置。