2011-12-30 118 views
2

下面是一個很好的例子:我試圖重載OpenGL的glutMouseFunc,以便它可以接受我選擇的命名空間和類函數。其中特別的是Init::DisplayInit::mouse,它是靜態的。問題是,這可能嗎?如果是這樣,這是如何實現的?函數可以接受靜態函數指針作爲參數嗎?

我實現從執行

..\OpenGL_03\/displayinit.h:27: error: variable or field 'glutMouseFunc' declared void 
..\OpenGL_03\/displayinit.h:27: error: expected primary-expression before 'int' 
..\OpenGL_03\/displayinit.h:27: error: expected primary-expression before 'int' 
..\OpenGL_03\/displayinit.h:27: error: expected primary-expression before 'int' 
..\OpenGL_03\/displayinit.h:27: error: expected primary-expression before 'int' 
..\OpenGL_03\/displayinit.h:27: error: void value not ignored as it ought to be 

注意

void glutMouseFunc(void (Init::DisplayInit::*mouse)(int, int, int, int)) { 
    (*mouse); 
} 

錯誤,我把函數的聲明在同一個文件的頭文件。我還確保聲明函數的定義駐留在名稱空間聲明之外(這兩個文件都包含大部分文件)。如圖所示,第一個錯誤之一讀取函數作爲變量或字段(???)。

+0

錯誤消息中的名稱與代碼片段不匹配。顯示實際的代碼。 – 2011-12-30 02:25:23

+0

第一個錯誤表明編譯器認爲你是由於冒號而指定了一個位域或附近;其餘的錯誤表明編譯器仍然感到困惑。 – 2011-12-30 02:27:25

回答

5

這不是定義glutMouseFunc的合理方法。它不應該立即調用回調函數,它應該稍後保存一個指針(當鼠標活動發生時)。

呼叫過剩提供的版本,並通過您的函數的地址:

#include <GL/glut.h> 
glutMouseFunc(&Init::DisplayInit::mouse); 

靜態成員函數與普通函數指針不兼容。

+2

你不需要那裏的符號,是嗎? – 2011-12-30 02:38:03

+1

@JonathanLeffler:對於鬆散的函數和靜態成員,編譯器會發現,即使沒有運算符地址,你也希望創建一個函數指針。對於非靜態成員,必須使用&符號。但是我總是使用&符號來說明事實上我正在傳遞函數的地址,這樣就更加清晰了。僅僅因爲你可以隱含地接受地址並不意味着你應該。同樣,在調用函數時,我更願意使用'(* func_ptr)()',即使'func_ptr()'也可以。 – 2011-12-30 02:41:39

4

標題問題的答案是「是的;函數可以接受靜態函數指針作爲參數」。

你不指定指針的命名空間或類使用它的功能在功能參數規格:

void glutMouseFunc(void (*mouse)(int, int, int, int)) { 
    (*mouse)(1, 2, 3, 4); 
} 

您指定的函數調用的命名空間或類:

glutMouseFunc(Init::DisplayInit::mouse); 
+0

我知道這個問題沒有強調這一點,但[glutMouseFunc'](http://www.opengl.org/resources/libraries/glut/spec3/node50.html)應該安裝一個回調函數,而不是調用提供的函數功能。 – 2011-12-30 02:32:49

+0

好的 - 那是......不清楚(並且需要OpenGL的詳細知識 - 或者至少比我有更多的知識)。這個符號比函數更接近函數調用,所以我將它轉換爲調用。如果它設置了一個回調函數,那麼就需要像'cb_func_ptr = mouse;'這樣的東西。 – 2011-12-30 02:37:18