2013-08-13 11 views
7

उदाहरण के लिए मैं auto प्रकार का एक चर होना चाहता था क्योंकि मुझे यकीन नहीं है कि यह किस प्रकार का होगा।क्या "ऑटो" सदस्य चर होना संभव है?

Cannot deduce auto type. Initializer required

वहाँ उसके चारों ओर एक रास्ता है:

जब मैं वर्ग/struct घोषणा में यह घोषणा करने के लिए यह मुझे इस त्रुटि दे रही है कोशिश?

struct Timer { 

    auto start; 

}; 
+1

अपने प्रकार –

+4

बाहर आंकड़ा है कि नहीं है क्या टेम्पलेट्स के लिए कर रहे हैं? – user1520427

+0

आप कब पता लगाते हैं कि यह किस प्रकार का होगा? संकलन समय या रन टाइम? क्या आप हमें कुछ संदर्भ दे सकते हैं? तुम क्या करने की कोशिश कर रहे हो? – Homer6

उत्तर

20

आप कर सकते हैं, लेकिन आप इसे static और const घोषित करने के लिए है:

struct Timer { 
    static const auto start = 0; 
}; 

A working example in Coliru

इस सीमा के साथ, इसलिए आपके पास start गैर-स्थिर सदस्य के रूप में नहीं हो सकता है, और विभिन्न वस्तुओं में अलग-अलग मान नहीं हो सकते हैं।

आप विभिन्न वस्तुओं के लिए start के विभिन्न प्रकार चाहते हैं, बेहतर

template<typename T> 
struct Timer { 
    T start; 
}; 

आप T के प्रकार निकालना चाहते हैं, आप एक कारखाने की तरह समारोह है कि कर सकते हैं एक टेम्पलेट के रूप में अपने वर्ग है कटौती टाइप करें।

template<typename T> 
Timer<typename std::decay<T>::type> MakeTimer(T&& startVal) { // Forwards the parameter 
    return Timer<typename std::decay<T>::type>{std::forward<T>(startVal)}; 
} 

Live example

3

यह वही है C++ draft standard सदस्य चर के लिए auto का उपयोग कर, खंड में 7.1.6.4 auto specifier पैरा 4 बारे में क्या कहना है:

The auto type-specifier can also be used in declaring a variable in the condition of a selection statement (6.4) or an iteration statement (6.5), in the type-specifier-seq in the new-type-id or type-id of a new-expression (5.3.4), in a for-range-declaration, and in declaring a static data member with a brace-or-equal-initializer that appears within the member-specification of a class definition (9.4.2).

यह इस प्रारंभ किया जाना चाहिए के बाद से भी मतलब है कि यह const होना चाहिए। तो निम्नलिखित की तरह कुछ काम करेंगे:

struct Timer 
{ 
    const static int start = 1; 
}; 

मैं, कि तुम हालांकि बहुत ज्यादा हो जाता है नहीं लगता कि मार्क पता चलता है या अब मैं इसके बारे में लगता है कि कुछ और हो सकता है आप सिर्फ एक Variant Type उस मामले में जरूरत के रूप में टेम्पलेट का उपयोग करते हैं आपको Boost.Variant या Boost.Any देखें।

1

नहीं। प्रत्येक कन्स्ट्रक्टर के पास start के लिए अपना प्रारंभिक प्रारंभकर्ता हो सकता है, इसलिए उपयोग करने के लिए कोई निरंतर प्रकार नहीं हो सकता है।

यदि आप एक प्रयोग करने योग्य अभिव्यक्ति है , तो आप उस का उपयोग कर सकते हैं:

struct Timer { 

    Foo getAFoo(); 

    delctype(Timer().getAFoo().Bar()) start; 

    Timer() : start(getAFoo().Bar()) { /***/ } 
}; 
संबंधित मुद्दे