2015-07-29 9 views
23

मेरी समस्या का SSCCE में संकलित नहीं है नेस्टेड टेम्पलेट कक्षाएं:साथ सूचक करने वाली विधि बजना ++

template <class T> class MyClass 
{ 
    template <void (MyClass::*M)() const> struct wrapper 
    { 
    virtual void call(); 
    }; 
}; 

template <typename T> 
template <void (MyClass<T>::*M)() const> 
void MyClass<T>::wrapper<M>::call() 
{ 
} 

इस कोड जीसीसी में संकलित लेकिन त्रुटि के साथ विफल:

error: nested name specifier 'MyClass<T>::wrapper<M>::' for declaration does not refer into a class, class template or class template partial specialization 
void MyClass<T>::wrapper<M>::call() 
~~~~~~~~~~~~~~~~~~~~~~~~~^ 
बजना में

++। क्यों?

कक्षा कॉल परिभाषा समस्या हल करती है, मुझे पता है। कोई गैर पॉइंटर-टू-विधि टेम्पलेट हर जगह ठीक काम करता है। टेम्पलेट/टाइपनाम के साथ प्रयोगों का कोई परिणाम नहीं है।

+0

ऐसा लगता है कि SO पर कोई भी जवाब नहीं जानता है, तो शायद आप क्लैंग बग सबमिट कर सकते हैं और फिर यदि आपको कोई प्रतिक्रिया मिलती है तो यहां पोस्ट करें। – Brian

+2

@ ब्रायन, ठीक है। https://llvm.org/bugs/show_bug.cgi?id=24357 प्रतीक्षा कर रहा है ... – dyomas

+4

आपके एसएससीसीई में कमांड लाइन स्विच और संस्करण संख्याएं नहीं हैं। – kfsone

उत्तर

-2

आप वर्ग परिभाषा विधि के क्रियान्वयन स्थानांतरित कर सकते हैं:

template <class T> class MyClass 
{ 
    template <void (MyClass::*M)() const> struct wrapper 
    { 
     virtual void call(){/* move implementation here */}; 
    }; 
}; 
+1

ऊपर देखें: _ कक्षा कॉल परिभाषा में समस्या हल होती है, मुझे पता है_ – dyomas

1

संभावित वैकल्पिक हल: std :: समारोह के बजाय आवरण प्रयोग करने पर विचार। यह बिल्कुल वही नहीं है (कम बाधा जिस पर फ़ंक्शन पॉइंटर्स स्वीकार्य हैं) लेकिन यह क्लैंग ++ पर संकलित होगा और आपके कोड को सरल बना देगा।

#include <functional> 

template <class T> class MyClass 
{ 
    typedef std::function<void(void) const > wrapper; 
}; 
संबंधित मुद्दे