2016-06-03 5 views
5

कौन सा संकलक सही है?क्या एक निजी स्थैतिक सदस्य को अपनी कक्षा के सदस्य कार्य के लिए डिफ़ॉल्ट तर्क के रूप में उपयोग किया जा सकता है?

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. 
+2

यह अनुकूलन से संबंधित हो सकता है। प्रश्न में रेखा कुछ भी नहीं करती है, इसलिए जीसीसी इसे अनुकूलित कर सकता है। जीसीसी हमेशा अनुकूलित चीजों में त्रुटियों के बारे में शिकायत नहीं करता है। अगर आप वास्तव में उस फ़ंक्शन पॉइंटर का उपयोग करने का प्रयास करते हैं तो मैं उत्सुक होगा। –

+0

@ विलियम कैप्लर [कुछ भी नहीं बदला।] (Http://coliru.stacked-crooked.com/a/96df544565dac680) – songyuanyao

+0

आश्चर्यजनक रूप से, अगर आप 'funPrivate' टेम्पलेट नहीं बनाते हैं तो क्लैंग इसे स्वीकार कर रहा है। –

उत्तर

2

§ के आधार पर 11

8 डिफ़ॉल्ट तर्क (8.3.6) में नाम घोषणापत्र के बिंदु पर बाध्य हैं, और डिफ़ॉल्ट तर्क के उपयोग के किसी भी बिंदु के बजाय उस बिंदु पर पहुंच की जांच की जाती है। फ़ंक्शन टेम्पलेट्स में डिफ़ॉल्ट तर्कों के लिए एक्सेसिंग जांच और क्लास टेम्पलेट्स के सदस्य फ़ंक्शंस में 14.7.1 में वर्णित किया गया है।

§ 14.7.1

12 एक समारोह टेम्पलेट f एक तरीका है कि एक डिफ़ॉल्ट तर्क की आवश्यकता में कहा जाता है प्रयोग की जाने वाली, निर्भर नाम ऊपर देखा जाता है, अर्थ विज्ञान की कमी जाँच कर रहे हैं, और डिफ़ॉल्ट तर्क में उपयोग किए गए किसी भी टेम्पलेट का त्वरण ऐसा किया जाता है जैसे डिफ़ॉल्ट तर्क एक फ़ंक्शन टेम्पलेट विशेषज्ञता में उसी स्कोप के साथ प्रारंभिक प्रारंभकर्ता था, उसी टेम्पलेट पैरामीटर और फ़ंक्शन टेम्पलेट के समान पहुंच f उस पी में प्रयोग किया जाता है oint। इस विश्लेषण को डिफ़ॉल्ट तर्क तत्काल कहा जाता है। तत्काल डिफ़ॉल्ट तर्क को f के तर्क के रूप में उपयोग किया जाता है।

तो, मुझे लगता है कि, जीसीसी की व्याख्या सही है। fun के पास निजी सदस्यों तक पहुंच है, इसलिए इसके डिफ़ॉल्ट तर्कों को उसी पहुंच में माना जाना चाहिए। लेकिन मैं उन पंक्तियों के बीच पढ़ रहा हूं कि 14.7.1 (12) सदस्य टेम्पलेट्स पर लागू होते हैं, न केवल टेम्पलेट्स को कार्य करते हैं। इसके अलावा मुझे गलतफहमी हो सकती है कि 14.7.1 (12) का अर्थ है।

+0

यदि 14.7 है।टेम्पलेट फ़ंक्शंस द्वारा 1 (12) का तात्पर्य है कि टेम्पलेट विधि यह एक निश्चित उत्तर होगा – user1650441

0

मैंने msvc13 में कोड का परीक्षण किया है। यह कोड काम करता है:

class A 
{ 
    template <typename T> 
    static void funPrivate() {} 
public: 
    template <typename T> 
    void fun(void (*f)() = funPrivate<T>) {} 
}; 
संबंधित मुद्दे