2012-06-02 35 views
6

我想在C++中聲明模板函數指針。成員函數指針內的模板類給出錯誤:必須是類或命名空間後跟'::'

template <class T> 
class MyClass 
{ 
public: 
    typedef const unsigned char* (T::*MyTemplatedEvent)(unsigned long &myParameter); 
}; 

,但由於某種原因,我不斷收到此錯誤:

'T': must be a class or namespace when followed by '::'

有人能告訴我在做什麼錯?
編譯器應該知道T是一個類。它是這麼說的上面的MyClass的聲明...

+0

我認爲你需要在'T ::'之前的'typename'。讓我檢查一下。 – chris

+0

@chris:不在這種情況下。 – Puppy

+1

此外,成員函數指針是不好的。只需使用'std :: function',你就不會有問題。 – Puppy

回答

1

我猜這是因爲我嘗試的模板是一個指針或原始其創造「MyClass的」編譯器知道能不能有和與之相關的函數指針...

+0

對不起,這是一個無法回答的問題。我面臨着同樣的問題,尋找一個真正的解決方案 - 這就是爲什麼我添加了一個獎金 – Theo

+1

@Theo :不,這是答案,OP在評論中澄清說他嘗試了'MyClass '或'MyClass '。這些基本類型根據定義不是類類型。如果出現此錯誤但沒有類似的代碼,可能要發佈作爲一個獨立的問題 – Xeo

+0

@Xeo:感謝您的澄清...我想這不是問題我因爲我正在通過一個類作爲模板參數。將發佈一個單獨的問題。 – Theo

-1

儘量做到以下幾點:

typedef T type; 
typedef const unsigned char* (type::*MyTemplatedEvent)(unsigned long &myParameter); 
0

首先要注意MyClass中定義的兩種方法2類聲明爲

template< class T > class MyClass 

template< typename T > class MyClass 

是等價的,您沒有通過使用一個關鍵字而使編譯器獲得更多信息。

除此之外,我會說編譯器是正確的,MyClass < int>將無法正常工作,因爲您不能在C++中編寫int :: something,而例如MyClass < std :: string>可以很好地工作。

+0

如果誰低估了這個可以以某種方式詳細說明原因,我會很有興趣。謝謝。 –

+0

(不是我的downvote)你的邏輯錯了。在模板中用'int'代替'T'不是一個詞法替換。你可以在模板中使用'p->〜T()'僞析構函數語法,然後用'T == long long'實例化它,即使你不能寫'p->〜long long )'在該模板之外。 – MSalters

+0

這個析構函數語法即使對於你所說的上下文中的整數也是「僞造的」,但這裏我們講的是模板實例化時的成員函數指針,這太多了。 –

-1

我不認爲你可以在C++模板函數指針,你可以檢查此鏈接 C++, function pointer to the template function pointer

「的typedef const的無符號字符*(T :: * MyTemplatedEvent)(unsigned long類型& myParameter);」這裏T是模板參數,不是任何名稱空間或類類型,T是數據類型可以是用戶定義的或基本數據類型,如int或char,但它不是一個名稱空間或類,所以這就是爲什麼你得到編譯錯誤,這是正確的。

+0

是的,你可以有一個模板函數指針,你發佈的鏈接交易有關不同的問題 – Sdra

+0

Sdra,你能幫我一個模板函數指針的工作代碼片段嗎?我不知道如何寫一個。 –

+0

@D Untouchable:是的;)只是發佈你的代碼的地方我可以看看,讓我知道! – Sdra

2

使用T::*MyTemplatedEvent,您期待T爲類類型,因爲只有類類型可以具有成員指針。這意味着如果你傳遞一個非類的類型,比如說intchar*,你會得到指定的錯誤,因爲沒有成員,反之也沒有這些類型的成員指針。

the compiler should know that T is a class. It says so above the MyClass declaration...

錯了。 class T與模板參數中的typename T相同,只是告知編譯器T的任何類型的佔位符,稍後將其作爲模板參數傳遞。它確實是而不是將類型限制爲類類型。

相關問題