2012-06-02 14 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 '::'

किसी बता सकते हैं मैं गलत क्या कर रहा हूँ?
संकलक को पता होना चाहिए कि टी एक वर्ग है। यह MyClass घोषणा से ऊपर तो ...

+0

मुझे लगता है कि आपको 'टी ::' से पहले 'टाइपनाम' की आवश्यकता है। मुझे जाँचने दो। – chris

+0

@ क्रिस: इस मामले में नहीं। – Puppy

+1

इसके अलावा, सदस्य फ़ंक्शन पॉइंटर्स खराब हैं। बस 'std :: function' का उपयोग करें और आपको समस्या नहीं होगी। – Puppy

उत्तर

1

मेरा अनुमान है कि यह है संकलक पता नहीं हो सकता है और समारोह सूचक उनसे जुड़े ...

+0

क्षमा करें, यह एक गैर-उत्तर है। मुझे एक ही समस्या का सामना करना पड़ रहा है और एक वास्तविक समाधान की तलाश है - यही कारण है कि मैंने एक उपहार दिया। – Theo

+1

@Theo : नहीं, यह जवाब है, ओपी ने एक टिप्पणी में स्पष्ट किया कि वह 'MyClass ' या 'MyClass 'की कोशिश करता है। उन आदिम प्रकार परिभाषा के अनुसार कक्षा प्रकार नहीं हैं। अगर आपको यह त्रुटि मिलती है लेकिन आपके पास समान कोड नहीं है, तो आप शायद इसे अकेले प्रश्न के रूप में पोस्ट करना चाहें। – Xeo

+0

@Xeo: स्पष्टीकरण के लिए धन्यवाद ... मुझे लगता है कि यह मुद्दा नहीं है I तब मैं सामना कर रहा हूं, क्योंकि मैं टेम्पलेट परम के रूप में कक्षा में गुजर रहा हूं। एक अलग सवाल पोस्ट करेंगे। – Theo

-1

कोशिश करने के लिए कहते हैं निम्नलिखित: क्योंकि मैं जो एक सूचक है टेम्पलेट या जो आदिम की "MyClass" बनाने का प्रयास करें

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

सबसे पहले ध्यान दें कि MyClass की परिभाषा में दो तरह से दो

template< class T > class MyClass 

के रूप में वर्ग की घोषणा और

template< typename T > class MyClass 

समकक्ष हैं, तो आप दूसरे पर एक कीवर्ड का उपयोग करके कंपाइलर को अधिक जानकारी नहीं दे रहे हैं।

इसके अलावा, मैं कहूंगा कि कंपाइलर सही है, MyClass < int> काम नहीं करेगा क्योंकि आप int :: कुछ सी ++ में नहीं लिख सकते हैं, जबकि उदाहरण के लिए MyClass < std :: string> पूरी तरह से काम करेगा ।

+0

यदि कोई भी इसे कम करता है तो किसी भी तरह से विस्तृत क्यों हो सकता है, मैं शक्तिशाली दिलचस्पी लेता हूं। धन्यवाद। –

+0

(मेरा डाउनवोट नहीं) आपका तर्क गलत है। टेम्पलेट में 'int' द्वारा' टी' का प्रतिस्थापन एक व्याख्यात्मक प्रतिस्थापन नहीं है। आपको टेम्पलेट में 'p-> ~ T() 'छद्म-विनाशक वाक्यविन्यास का उपयोग करने की अनुमति है, और उसके बाद इसे' टी == लंबे समय तक 'के साथ तुरंत चालू करें, भले ही आप' p-> ~ लंबे समय तक नहीं लिख सकें () 'उस टेम्पलेट के बाहर। – MSalters

+0

यह विनाशक वाक्यविन्यास आपके द्वारा संदर्भित संदर्भ में इंक के लिए भी "फिक्र" है, लेकिन यहां हम टेम्पलेट तत्काल समय पर सदस्य फ़ंक्शन पॉइंटर के बारे में बात कर रहे हैं, और यह बहुत अधिक है। –

-1

मुझे लगता है कि आप सी ++ में एक टेम्पलेट समारोह सूचक हो सकता है न, तो आप इस लिंक C++, function pointer to the template function pointer

जाँच कर सकते हैं "typedef स्थिरांक अहस्ताक्षरित चार * (टी :: * MyTemplatedEvent) (अहस्ताक्षरित लंबे & myParameter);" यहां टी टेम्पलेट पैरामीटर कोई नामस्थान या कक्षा प्रकार नहीं है, टी एक डाटाटाइप उपयोगकर्ता परिभाषित या इंट या चार जैसे मूल डेटाटाइप हो सकता है, लेकिन यह नामस्थान या कक्षा नहीं है, इसलिए आपको संकलन त्रुटि क्यों मिल रही है, जो सही है।

+0

हां, आपके पास टेम्पलेट फ़ंक्शन पॉइंटर हो सकता है, आपके द्वारा पोस्ट किए गए लिंक को थोड़ा अलग समस्या – Sdra

+0

एसडीआरए के बारे में सौदा किया गया है, क्या आप कृपया टेम्पलेट फ़ंक्शन पॉइंटर के वर्किंग कोड स्निपेट के साथ मेरी सहायता कर सकते हैं? मुझे यकीन नहीं है कि एक कैसे लिखना है। –

+0

@ डी अस्पृश्य: हाँ;) बस अपना कोड कहीं कहीं पोस्ट करें, मैं देख सकता हूं और मुझे बता सकता हूं! – Sdra

2

T::*MyTemplatedEvent के साथ, आप T कक्षा वर्ग होने के लिए उम्मीद कर रहे हैं, क्योंकि केवल कक्षा के प्रकारों में सदस्य पॉइंटर्स हो सकते हैं। इसका अर्थ यह है कि यदि आप एक गैर-वर्ग प्रकार पास करते हैं, तो int या char* कहें, आपको इंगित त्रुटि मिलती है, क्योंकि कोई सदस्य नहीं हैं और इसके विपरीत कोई सदस्य नहीं है।

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

गलत। class T टेम्पलेट पैरामीटर में typename T जैसा ही है, और केवल संकलक को बताता है कि T प्रकार के लिए प्लेसहोल्डर है जिसे बाद में टेम्पलेट तर्क के रूप में पास किया गया है। यह प्रकार प्रकार को वर्ग प्रकार के रूप में प्रतिबंधित करता है।

संबंधित मुद्दे

 संबंधित मुद्दे