2015-12-19 6 views
7
#include <iostream> 

struct X2 
{ 
    int i; 
    int j; 
    char buf[10]; 
}; 

X2 glob{1,2,"abc"}; // OK 

struct X 
{ 
    X2 x2; 

    template<typename... Args> 
    X(Args&&... args): x2{args...} {} 
}; 

int main() 
{ 
    X x;    // OK 
    X y{1, 2};   // OK 
    X z{1, 2, "abc"}; // error 
} 

अंतिम पंक्ति देता त्रुटि: 17 : error: invalid conversion from 'const char*' to 'char' [-fpermissive]बिल्कुल सही अग्रेषण में विफल रहता है जब लक्ष्य सरणी के साथ कुल है

अगर मैं std::forward(args)...args... के बजाय का उपयोग करें तो और भी अधिक त्रुटियों आ; और अगर त्रुटियां स्ट्रिंग अक्षर के बजाय {'a', 'b', 'c', '\0'} प्रारंभकर्ता के रूप में उपयोग करने का प्रयास करती हैं तो त्रुटियां भी होती हैं।

इस काम करने के लिए एक रास्ता है, यानि कि X z{......}; जहां ब्रेसिज़ कि x2 के लिए एक कानूनी प्रारंभकर्ता होगा अंदर कुछ भी स्वीकार किया जाता है और वास्तव में है x2 प्रारंभ अनुमति देते हैं?

+0

"* इस काम करने के लिए एक रास्ता है" *, निर्माता निकालें, या 'buf' –

+0

लेखन' 'एक', 'बी' के प्रकार के रूप में उपयोग 'std :: स्ट्रिंग', ' सी ',' एबीसी 'के बजाय' '' '' 0 '' सी ++ 17 –

उत्तर

5

यह एक अनिश्चित डिजाइन मुद्दा यह है कि सी ++ 98 से विरासत में मिला था है: कुछ रूपांतरण या initializations वाक्य रचना शाब्दिक को, विशेष रूप से स्ट्रिंग शाब्दिक में चार सरणियों के लिए initializers ([dcl.init.string]/1) और के रूप में प्रतिबंधित कर रहे हैं पूर्ण सूचकांक स्थिरांक ([conv.ptr]/1) के रूप में पूर्णांक अक्षर। वह, ज़ाहिर है, "सही" अग्रेषण के साथ अच्छा नहीं है।

अशक्त संकेतों के लिए, इस मुद्दे को nullptr, जो 0 के बजाय इस्तेमाल किया जा सकता है और बाद भी भेजा जा रहा ठीक काम करता है शुरू करने से उन्हें धोखा दिया गया था।

आपके मामले में, वहाँ मूल रूप से दो प्रमुख विकल्प हैं:

  • शोषण ब्रेस इलिजन - X एक समग्र है, भी:

    struct X { 
        X2 x2; 
    } z{1, 2, "abc"}; // Ok 
    
  • घोषित buf वर्ग प्रकार, उदाहरण के लिए है करने के लिए std::string या, शायद आपके मामले में अधिक उपयुक्त, कुछ सांख्यिकीय रूप से समतुल्य समतुल्य (आकार 10 तक सीमित)।

+0

का उपयोग करते हुए वीएस के साथ काम करता है, मेरा मतलब है कि आम तौर पर 'एक्स' एक समग्र नहीं होगा, मेरा विचार गैर-योग को एक साथ जोड़ना था उस सार्वजनिक डेटा के लिए अभी भी कुल प्रारंभिक उपयोग का उपयोग करने के लिए बहुत सारे सार्वजनिक डेटा –

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