10

मैं निम्नलिखित संकलक त्रुटि से हैरान हूं:'struct प्रारंभकर्ता में अतिरिक्त तत्वों' के साथ त्रुटि सी ++ 11 वर्दी प्रारंभ

template <typename T> 
struct A 
{ 
    A(T t): t_{t} {} 

    T t_; 
}; 

struct S 
{ 
}; 

int main() 
{ 
    A<S> s{S{}}; 
} 

त्रुटि (बजना के साथ):

test.cpp:4:16: error: excess elements in struct initializer 
    A(T t): t_{t} {} 
      ^
test.cpp:15:10: note: in instantiation of member function 'A<S>::A' requested here 
    A<S> s{S{}}; 
     ^

जीसीसी एक समान त्रुटि देता है।

से t_ की प्रतिलिपि बनाने की कोशिश करने के लिए अभिव्यक्ति की अपेक्षा करेगा। चूंकि S में एक पूर्ण रूप से जेनरेट की गई प्रतिलिपि निर्माता है, इसलिए मैं यह एक समस्या होने की उम्मीद नहीं करता।

कोई बता सकता है कि यहां क्या हो रहा है?

उत्तर

17

S में एक पूर्ण रूप से जेनरेट की गई प्रतिलिपि हो सकती है, लेकिन S कुछ और भी है। एक कुल। इसलिए, (लगभग) {} का कोई भी उपयोग उस पर कुल प्रारंभिक कार्य करेगा। इसलिए {} की सामग्री कुल के सदस्यों के लिए मूल्य होने की उम्मीद है। और चूंकि आपका कुल खाली है ... बूम।

टेम्पलेट कोड में, इन कारणों से वर्दी प्रारंभिक वाक्यविन्यास से बचा जाना चाहिए। अज्ञात प्रकार T के लिए, आप यह सुनिश्चित नहीं कर सकते कि वास्तव में {...} क्या करेगा।

+0

'समान प्रारंभिक वाक्यविन्यास को इन कारणों से बचा जाना चाहिए' ... और कई अन्य कारणों से 'एस' को संशोधित करते समय अर्थशास्त्र बदलना। – ipc

+1

@ipc: मैं अब तक नहीं जाऊंगा, लेकिन तथ्य यह है कि यह कभी-कभी मुश्किल हो सकता है :) –

+1

तब इतना समान प्रारंभिक वाक्यविन्यास नहीं है? – zahir

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