2012-03-13 71 views
1

我試圖傳遞成員函數指針作爲模板參數。下面是代碼:當使用成員函數作爲模板參數時C++編譯錯誤

template <typename Ret, typename T, Ret(T::*mptr)()> 
Handle<Value> get_value (Local<String> name, const AccessorInfo& info) 
{ 
    ... 
} 

template <typename Ret, typename T> 
void mbind (const char* name, Ret (T::*mptr)()) 
{ 
    .... 
    objectTemplate->SetAccessor (String::NewSymbol (name),get_value<Ret,T,mptr>); 
} 

這是我得到的錯誤:

wrapper.h:184:5: error: ‘mptr’ is not a valid template argument for type ‘int (Cell::*)()’ 
wrapper.h:184:5: error: it must be a pointer-to-member of the form `&X::Y' 
... 

據我所知指向成員函數是有效的模板參數。我不明白以前的代碼有什麼問題。我使用的編譯器是Ubuntu下的g ++ 4.5.2。

在此先感謝。

UPDATE:

這似乎代碼應該是錯了,因爲mptr是一個運行時變量。在另一方面,代碼前面的摘錄編譯:

http://ideone.com/cv8pq

所以...是正確的嗎?它依賴於編譯器嗎?

回答

4

mptr是一個運行時變量 - 你不能把它作爲模板參數。檢查http://ideone.com/CIL4C

編輯

奇怪的是http://ideone.com/cv8pq有類似你的代碼的東西成功編譯和作品。

+0

謝謝。我已經將指向成員函數的指針添加爲'mbind()'的模板參數,並且它可以工作。調用是這樣的:'mbind (「getWidth」);' 現在我想知道是否有任何其他方式來調用'mbind()'更簡單用戶(不必指定所有這些模板參數)。 謝謝! – user1192525 2012-03-14 00:13:19

+0

所以......我們不知道它是否有效(並且僅由某些編譯器支持):d – user1192525 2012-03-14 00:19:20

1

mbind應該已經採取模板參數:

template <typename Ret, typename T, Ret (T::*mptr)()> 
void mbind (const char* name) { 
    objectTemplate->SetAccessor (String::NewSymbol (name),get_value<Ret,T,mptr>()); 
} 

PS:你get_value<>後忘了()

相關問題