c++ - g++ 和 Visual Studio 中方法指针转换规则的区别

标签 c++ visual-studio-2008 pointers methods g++

struct Test
{
    typedef unsigned (Test::*MethodPtr)();
    unsigned testMethod() {}
};
typedef void (*ThreadPtr)(void *);
ThreadPtr threadPtr = reinterpret_cast<ThreadPtr>(&Test::testMethod);

我想在特定对象的类方法中启动一个线程。我使用方法指针作为线程入口点并将对象指针作为唯一参数传递。这是有效的,因为我的结构中没有任何虚拟声明。

我的问题与 reinterpret_cast 操作有关。 g++ 允许这样做,而 Visual Studio 2008 不允许。我通过将方法指针值直接存储到 threadPtr 变量中来绕过 VS2008 限制。生成的代码工作正常,但对于应该是一个简单操作的操作来说,这是一个令人毛骨悚然的解决方法。谁能提供更优雅的替代方案?

谢谢

-G

编辑:

澄清一下,gcc给出的警告如下:

methodPtrTest.cpp:14: warning: converting from ‘void (Test::*)()’ to ‘void (*)(void*)’

最佳答案

好的,这样做:

void threadMethod(void* ptr) {
    static_cast<Test*>(ptr)->testMethod();
}

ThreadPtr threadPtr = &threadMethod;

这样,您处理的是一个真正的函数,而不是 PMF。

关于c++ - g++ 和 Visual Studio 中方法指针转换规则的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6384292/

相关文章:

visual-studio-2008 - 在C++/CLI项目中嵌入资源

c++ - MFC .dll,CString问题,IDA c++伪代码,有多接近?

C++ 指南 : Understanding How Pointers Work

c - 在 Xcode 6.1 中获取预期标识符或 '(' 问题

c++ - hFind 返回 INVALID_HANDLE_VALUE

c++ - 内联函数不能包含递归、转到循环等?

c++ - 将 OpenGL 与 Eigen 一起用于存储顶点数据和 glVertexAttribPointer

c++ - 在特定点打印结构变量

asp.net - 如何在弹出窗口中打开aspx网页

C++:将我的对象转换为不同的父类(super class)会导致不同的指针地址