2015-02-06 2 views
7

मैं क्यूटी निर्माता में स्वत: पूर्ण std::vector के लिए काम कैसे कर सकते हैं std :: वेक्टर तत्वों के लिए काम नहीं करता है? क्या यह काम करना नहीं सामान्य है?क्यूटी निर्माता का स्वत: पूर्ण (IntelliSense)

उदाहरण के लिए, एक ताजा नई परियोजना पर, मैं एक struct foo { int bar; }; पैदा करते हैं। अगर मैं foo की एक QVector बनाने के लिए, IntelliSense/स्वत: पूर्ण ठीक काम करता है:

enter image description here

लेकिन एक std::vector<foo> v2कुछ नहीं के लिए होता है के बाद मैं v2[0].

मैं में डॉट क्यूटी निर्माता 3.3 पर दबाएँ। 0, विजुअल स्टूडियो कंपाइलर टूल-चेन का उपयोग करके (इसलिए एसटीएल वीएस से आता है, जीसीसी नहीं अगर इससे कोई फर्क पड़ता है)।

संपादित करें: मुझे एक संबंधित बग की सूचना मिली है (हालांकि इसके बारे में इटरेटर) - https://bugreports.qt.io/browse/QTCREATORBUG-1892। मैं इस समस्या को भी पुन: उत्पन्न करता हूं।

संपादित करें 2: मैं एक कस्टम टेम्पलेट वर्ग के साथ परीक्षण किया:

struct bar { 
    int b; 
}; 
template<class T> struct foo { 
    T operator [](int a) { return T(); } 
}; 

और यह ठीक काम कर रहा है:

enter image description here

+0

संभव नहीं है। दुर्भाग्यवश, क्यूटी निर्माता के कोड मॉडल में टेम्पलेट्स के साथ समस्याएं हैं। इसे क्लैंग का उपयोग करने के लिए कुछ काम चल रहा था, लेकिन मुझे नहीं पता कि यह कैसे समाप्त हुआ। –

+0

@cassiorenan बीटीडब्ल्यू, क्या यह आपके लिए भी पुनरुत्पादन करता है? – sashoalm

+0

हाँ, यह करता है। मैं क्यूटी निर्माता 3.3.2 बीटीडब्लू का उपयोग कर रहा हूं, आपका परीक्षण त्रुटिपूर्ण है। ऑपरेटर को लागू करने का प्रयास करें [] जो कि बस एक देता है। –

उत्तर

5

मेरी टिप्पणी के अनुसार, यह बस संभव नहीं यह करने के लिए है । आप एक बग रिपोर्ट दर्ज कर सकते हैं और उम्मीद करते हैं कि वे इसे ठीक कर लेंगे।

reference operator[](difference_type _Off) const 
    { // subscript 
    return (*(*this + _Off)); 
    } 

जिसमें referenceAllocator::reference रूप typedef'ed है: बेहतर व्याख्या करने के लिए, यह std :: वेक्टर के कार्यान्वयन के साथ कुछ है। जाहिर है क्यूटी निर्माता को मूल वर्ग में इसके बाद समस्याएं हैं। की तुलना उस के साथ QVector के ...

inline T &QVector<T>::operator[](int i) 
{ Q_ASSERT_X(i >= 0 && i < d->size, "QVector<T>::operator[]", "index out of range"); 
    return data()[i]; } 

... जो सीधे टी & के संदर्भ में परिभाषित किया गया है, और आप देख सकते हैं कि ऐसा क्यों इसके लिए काम करता है।

अद्यतन: cppreference's page on vector में देख रहे हैं, ऐसा लगता है कि, सी ++ 11 के बाद, संदर्भ टाइपिफ़ाईड को केवल value_type & के रूप में टाइप किया जाना चाहिए। मैंने CONFIG += c++11 के साथ निर्माण करने का प्रयास किया है और यह अभी भी काम नहीं करता है।

और एक और अद्यतन:

struct T { int b; }; 
struct foo{ 
    typedef T value_type; 
    T a; 
    value_type operator[](int); 
    value_type bar(); 
}; 

दिलचस्प बात यह है है: एक न्यूनतम परीक्षण का मामला जो काम नहीं करता है

template<typename T> 
class foo{ 
public: 
    typedef T value_type; 
    typedef value_type& reference; 
    T a; 
    reference operator[](int){return a;} 
}; 

struct bar{int b;}; 
0

मैं आसान बनाने @ केसियो का उदाहरण कोड में कामयाब समस्या उत्पन्न होने के लिए कोड करने के लिए प्रबंधित a.bar(). काम करता है लेकिन a[1]. न हो। इसके अलावा, जो सबसे कह है कि यदि आप ऑपरेटर की घोषणा [] foo::value_type operator[](int); के रूप में, स्वत: पूर्ण काम करेगा।

2

अब बजना कोड मॉडल उपलब्ध है:

मदद के लिए जाएं> प्लगइन्स के बारे में ...-> ClangCodeModel

क्यूटी निर्माता को पुनरारंभ करें सक्षम करें। जांचें कि यह सक्रिय हो गया है; टूल्स -> सी ++ -> कोड मॉडल

स्टडी: वेक्टर के लिए वोला कोड स्वत: पूर्ण।

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