Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类型为“(Foo::)(int,int)”的参数与main.cpp中的“void(*)(int,int)”不匹配_C++_Glut - Fatal编程技术网

C++ 类型为“(Foo::)(int,int)”的参数与main.cpp中的“void(*)(int,int)”不匹配

C++ 类型为“(Foo::)(int,int)”的参数与main.cpp中的“void(*)(int,int)”不匹配,c++,glut,C++,Glut,我想将我的Foo类对象的Resize方法作为glutrefunc的参数传递,但我得到了那个错误。 我该怎么通过呢 这是我对调整大小的定义: class Foo{ public: void Resize(int w, int h); ... } 我试着这样称呼它 glutReshapeFunc(foo->Resize); 当foo不是指针的时候,它还可以,我用它来传递foo.Resize,它就工作了 提前感谢非静态函数采用了一个额外的隐藏参数,因此它们与具有明显相

我想将我的Foo类对象的Resize方法作为glutrefunc的参数传递,但我得到了那个错误。 我该怎么通过呢

这是我对调整大小的定义:

class Foo{
    public:
    void Resize(int w, int h);
    ...
}
我试着这样称呼它

glutReshapeFunc(foo->Resize);
当foo不是指针的时候,它还可以,我用它来传递foo.Resize,它就工作了


提前感谢

非静态函数采用了一个额外的隐藏参数,因此它们与具有明显相似签名的全局非成员函数不兼容

您可以将Resize设置为static,但在确定要操作的对象时会遇到问题。Gluefunc提到

在回调之前,当前 窗口设置为具有 已经被重塑


因此,您可以从静态成员中开始。

非静态函数采用一个额外的隐藏参数,因此它们与具有明显相似签名的全局非成员函数不兼容

您可以将Resize设置为static,但在确定要操作的对象时会遇到问题。Gluefunc提到

在回调之前,当前 窗口设置为具有 已经被重塑

<>你可以从静态成员中开始。

fo> >调整大小本身不是C++中的有效表达式。因此,您的代码完全无效。获得C++中非静态成员函数指针的唯一方法是显式使用“and”运算符并显式使用成员函数的限定名。在您的情况下,这将是&Foo::Resize

然而,这一切都离题了,因为您显然需要一个指向普通函数的指针,而不是指向成员函数的指针。指向成员函数的指针是一个性质完全不同的对象,甚至与指向普通函数的指针毫不相似。换句话说,你想做的是不可能的。无论您做什么,都不能将指向Foo::Resize的指针传递给glutreformefunc

如果您想将非静态成员函数作为回调调用,那么您的责任是使用某种中间包装函数来接收调用,并通过适当的对象将其委托给成员函数。C++本身没有提供好的特性,但是它经常可以使用您试图使用的库的特定特性来实现,假设库是用这样的思想设计的。P>> Po>自变量不是C++中的一个有效表达式。因此,您的代码完全无效。获得C++中非静态成员函数指针的唯一方法是显式使用“and”运算符并显式使用成员函数的限定名。在您的情况下,这将是&Foo::Resize

然而,这一切都离题了,因为您显然需要一个指向普通函数的指针,而不是指向成员函数的指针。指向成员函数的指针是一个性质完全不同的对象,甚至与指向普通函数的指针毫不相似。换句话说,你想做的是不可能的。无论您做什么,都不能将指向Foo::Resize的指针传递给glutreformefunc


如果您想将非静态成员函数作为回调调用,那么您的责任是使用某种中间包装函数来接收调用,并通过适当的对象将其委托给成员函数。C++本身没有提供好的特性,但是它经常可以使用您试图使用的库的特定特性来实现,假设库是用这样的思想设计的。p> 假设每个窗口有一个foo对象,则需要将当前窗口映射到表示该窗口的foo对象

如果您只有一个foo对象,或者您想使该方法成为静态的,那么请停止。这是一个C库,因此DES不理解C++ ABI。将代码切换回使用C函数。如果你的代码是用C++文件编写的,或者编译成C++,那么你必须声明函数为ExtnC,以确保绑定正确。 如果每个窗口都有一个Foo对象,那么我会这样做:

std::map<int,Foo*>   myFoo;

extern "C" void myWindowRsize(int width, int height);

myInitGlut()
{
    // Do Init stuff
    glutReshapeFunc(&myWindowRsize);
}

myCreateWindow(std::string const& name)
{
    // When a window is created store the mapping:
    winID =  glutCreateWindow(name.c_str());

    // Now we have a new Foo for each window
    // Note this code is not complete myFoo should manage the objects this suggests
    // using a container of smart pointers or a smart container see boost for details.
    myFoo[winID] = new Foo();
}

// Your static resize function called for all windows
void myWindowRsize(int width, int height)
{
    // Get the current window. Then get the foo object for that windows.
    int   currentWindow = glutGetWindow();
    Foo*  windowsFoo    = myFoo[currentWindow];

    // Call your resize method.
    windowsFoo->Resize(width, height);
}

您需要的是将当前窗口映射到表示该窗口的foo对象,假设每个窗口有一个foo对象

如果您只有一个foo对象,或者您想使该方法成为静态的,那么请停止。这是一个C库,因此DES不理解C++ ABI。将代码切换回使用C函数。如果你的代码是用C++文件编写的,或者编译成C++,那么你必须声明函数为ExtnC,以确保绑定正确。 如果每个窗口都有一个Foo对象,那么我会这样做:

std::map<int,Foo*>   myFoo;

extern "C" void myWindowRsize(int width, int height);

myInitGlut()
{
    // Do Init stuff
    glutReshapeFunc(&myWindowRsize);
}

myCreateWindow(std::string const& name)
{
    // When a window is created store the mapping:
    winID =  glutCreateWindow(name.c_str());

    // Now we have a new Foo for each window
    // Note this code is not complete myFoo should manage the objects this suggests
    // using a container of smart pointers or a smart container see boost for details.
    myFoo[winID] = new Foo();
}

// Your static resize function called for all windows
void myWindowRsize(int width, int height)
{
    // Get the current window. Then get the foo object for that windows.
    int   currentWindow = glutGetWindow();
    Foo*  windowsFoo    = myFoo[currentWindow];

    // Call your resize method.
    windowsFoo->Resize(width, height);
}

简单地向函数添加static就可以实现上面Remus Rusanu所述的技巧。这确保了该方法始终可用。

只需向函数中添加static即可实现上述Remus Rusanu所述的技巧。这可确保满足以下条件:
hod始终可用。

与Martin对sje397的回答所作的评论相同:实际上,如果要从C代码中调用函数,则需要传递一个指向具有C链接的函数的指针,并且程序不能指定静态成员函数具有C链接。它可能让我们面对它,可能是在您的实现中调用静态成员函数,就像它有C链接一样,它可能会让我们面对它,在GLRESHAPEFUNC编译为C++的实现中,情况可能不会是这样的。与Martin对sje397的回答所作的评论相同:如果要从C代码回调函数,实际上需要传递一个指向具有C链接的函数的指针,并且程序不能指定静态成员函数具有C链接。它可能让我们面对它,可能是在您的实现中调用静态成员函数,就像它的C链接只是工作,并且它可能让我们面对它,在您的实现中,GLUTHESHAPEFUNC编译为C++的情况可能不会是这样,这两个都可以拯救您。