2012-11-03 11 views
7

मैं एक बाहरी "सी" फ़ंक्शन पॉइंटर के प्रकार की घोषणा करना चाहता हूं। यह एक सदस्य चर है। this question में वाक्यविन्यास मैं संकलित नहीं कर सकता।किसी सदस्य को बाहरी "सी" फ़ंक्शन में पॉइंटर के रूप में घोषित करने के लिए कैसे करें?

template<typename Sig> struct extern_c_fp { 
    extern "C" typedef typename std::add_pointer<Sig>::type func_ptr_type; 
}; 

मैं दोनों सिरों पर extern "C" रखने के साथ प्रयोग किया है, और typedef और typename और type और func_ptr_type के बीच है, लेकिन संकलक के बीच सभी को अस्वीकार कर दिया। कोई सुझाव?

+0

'बाहरी "सी" 'उपनाम टेम्पलेट्स के साथ, यह काम करेगा। http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1463 –

+2

बीटीडब्ल्यू आपको 'बाहरी 'होने के लिए' सिग 'की आवश्यकता है सी" '। फ़ंक्शन प्रकार के पॉइंटर एडिशन में लिंकेज नहीं है। यह फ़ंक्शन प्रकार स्वयं ही है। फ़ंक्शन प्रकार बनाते समय आप लिंक को प्रेरित करते हैं। किसी मौजूदा फ़ंक्शन प्रकार का नामकरण नहीं करते समय - उस मौजूदा प्रकार के लिंक के पास है। –

+0

http://liveworkspace.org/code/768027ef00bb0a31e76d8d856ac50801 यह कम शिकायत करता है, लेकिन अभी भी समस्याग्रस्त है। – Puppy

उत्तर

1
extern "C" { 
    template<typename R, typename... Args> 
    using extern_c_fp = R(*)(Args...); 
} 

using my_function_ptr = extern_c_fp<void, int, double>; 
// returns void, takes int and double 

यह वही इंटरफ़ेस का उपयोग नहीं करता है के रूप में आप का उपयोग करें, लेकिन एक तरह से Sig की वापसी प्रकार और तर्क प्रकारों को निकालने के लिए हो सकता है।

यह क्लैंग 3.1 में काम करता है। ज़ीओ ने it didn’t work in GCC की ओर इशारा किया। मुझे यकीन नहीं है कि यह कंपाइलर में एक बग है, इसलिए इसका उपयोग करते समय सावधान रहें।

0

आप (7.5p4 से) ऐसे ही एक typedef की घोषणा नहीं कर सकते हैं:

एक कड़ी-विनिर्देश केवल नाम स्थान गुंजाइश (3.3) में पाए जाते हैं जाएगा।

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

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