2017-01-24 6 views
6

मेरे पास है:क्या वेक्टर <auto> अनुमत नहीं है? (त्रुटि: 'ऑटो' के अवैध उपयोग)

#include <cstdlib> 
#include <vector> 

using namespace std; 

int main() 
{ 
    auto a = -SOME_CONST_MAX; 
    vector<auto> myVec {a, a, a, a}; 
} 

मैं SOME_CONST_MAX के प्रकार पता नहीं है, लेकिन मैं -SOME_CONST_MAX के प्रकार का एक वेक्टर बनाना चाहते हैं। मुझे लगता है कि vector<auto> काम करेगा क्योंकि यह a के प्रकार से घटाएगा। g++ -std=c++14 main.cpp

main.cpp:9:9: error: invalid use of ‘auto’ 
    vector<auto> myVec {a, a, a, a}; 
     ^
main.cpp:9:13: error: template argument 1 is invalid 
    vector<auto> myVec {a, a, a, a}; 
      ^
main.cpp:9:13: error: template argument 2 is invalid 
main.cpp:9:32: error: scalar object ‘myVec’ requires one element in initializer 
    vector<auto> myVec {a, a, a, a}; 
           ^

vector<auto> अनुमति नहीं है:

मैं इन त्रुटियों चल रहा हो रही है? मैं क्या गलत कर रहा हूं? वास्तव में सरल

+14

आप 'वेक्टर ' का उपयोग कर सकते हैं – Slava

+9

सी ++ 17 कक्षा टेम्पलेट्स के लिए टेम्पलेट प्रकार की कटौती पेश करेगा, इसलिए आपको 'वेक्टर myVec {a, a, a, a};' और कुछ करने की अनुमति दी जाएगी। संकलक 'myVec' के प्रकार को' वेक्टर 'के रूप में घटाएगा। – vsoftco

+1

अत्यधिक संबंधित: http://stackoverflow.com/questions/984394/why-not-infer-template-parameter-from-constructor – NathanOliver

उत्तर

9

मैं खोजने के लिए और सुरुचिपूर्ण Slava के समाधान

vector<decltype(a)> myVec {a, a, a, a}; 

लेकिन, बस एक variadic टेम्पलेट समारोह

template <typename T, typename ... Ts> 
std::vector<T> getVect (T const & t, Ts const & ... ts) 
{ return { t, ts... } ; } 

आप उपयोग कर सकते हैं के साथ एक और रास्ता दिखाने के लिए, auto फिर

auto myVec = getVect(a, a, a, a, a); 
+0

यही कारण है कि सी ++ 17 इतना भयानक होगा :) टेम्पलेट वर्ग कटौती के माध्यम से इस "मेक _ए" कार्यों से छुटकारा पाएं। – vsoftco

7

अगर मुझे सही याद है,के लिए प्रस्ताव दिए गए हैंवाक्यविन्यास। वे जहां सी ++ मानक समिति द्वारा स्वीकार नहीं किया जाता है।

सी ++ 17 std::vector bob = {a,a,a,a}; जैसे कुछ पेश करेगा जो बस काम करता है। <auto> की कमी पर ध्यान दें। बाद में निम्नलिखित के बाद std में वास्तविक उपयोग के साथ यह भाषा सुविधा हो सकती है।

auto टेम्पलेट्स में भी जोड़ा गया है, लेकिन autoहमेशा एक मान कभी भी एक प्रकार नहीं है। इसलिए किसी प्रकार को बदलने के लिए auto का उपयोग करना एक बुरा विचार माना जाता था।

template<auto x> 
using constant_t=std::integral_constant<decltype(x),x>; 
template<auto x> 
constexpr constant_t<x> constant{}; 

और अब constant<7> एक std::integral_constant<int,7> है:

यहाँ एक टेम्पलेट में auto का एक प्रयोग है। यह कई कारणों से उपयोगी माना जाता है।

वर्तमान सी का उपयोग कर ++ अपने व्यावहारिक समस्या का जवाब है:

auto a = -SOME_CONST_MAX; 
std::vector<decltype(a)> myVec {a, a, a, a}; 

जहाँ हम a के प्रकार के अनुमान और यह vector लिए गुजरती हैं।

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