कौन सा संकलक सही है?क्या एक निजी स्थैतिक सदस्य को अपनी कक्षा के सदस्य कार्य के लिए डिफ़ॉल्ट तर्क के रूप में उपयोग किया जा सकता है?
class A
{
public:
template <typename T>
void fun(void (*f)() = funPrivate<T>) {}
private:
template <typename T>
static void funPrivate() {}
};
int main(int argc, char** argv)
{
A a;
a.fun<int>();
return 0;
}
संकलित ठीक पर: बजना संस्करण 3.4-1ubuntu3 (टैग/RELEASE_34: जीसीसी संस्करण 4.8.5 (उबंटू 4.8.5-2ubuntu1 ~ 14.04.1) पर एक त्रुटि में
परिणाम/अंतिम) (LLVM 3,4)
a.cpp:5:27: error: 'funPrivate' is a private member of 'A'
void fun(void (*f)() = funPrivate<T>) {}
^~~~~~~~~~~~~
a.cpp:14:3: note: in instantiation of default function argument expression for 'fun<int>' required here
a.fun<int>();
^
a.cpp:8:16: note: declared private here
static void funPrivate() {}
^
1 error generated.
यह अनुकूलन से संबंधित हो सकता है। प्रश्न में रेखा कुछ भी नहीं करती है, इसलिए जीसीसी इसे अनुकूलित कर सकता है। जीसीसी हमेशा अनुकूलित चीजों में त्रुटियों के बारे में शिकायत नहीं करता है। अगर आप वास्तव में उस फ़ंक्शन पॉइंटर का उपयोग करने का प्रयास करते हैं तो मैं उत्सुक होगा। –
@ विलियम कैप्लर [कुछ भी नहीं बदला।] (Http://coliru.stacked-crooked.com/a/96df544565dac680) – songyuanyao
आश्चर्यजनक रूप से, अगर आप 'funPrivate' टेम्पलेट नहीं बनाते हैं तो क्लैंग इसे स्वीकार कर रहा है। –