ऐसा लगता है कि एक उपनाम टेम्पलेट के पैक पैरामीटर के स्थान पर एक पैक तर्क केवल का विस्तार किया जा सकता है।उपनाम टेम्पलेट के लिए पैक विस्तार
template <class T, class... Args> struct x { using type = T; };
template <class T, class... Args> using x_t = typename x<T, Args...>::type;
template <class... Args> using x_fix_t = typename x<Args...>::type;
template <class... Args> auto f(Args...) -> void {
typename x<Args...>::type v1; // OK
x_t<Args...> v2; // Error
x_fix_t<Args...> v3; // OK
}
सरल मामला:: यह एक वर्ग या एक समारोह टेम्पलेट के लिए सच नहीं है
template <class T, class U> using y_t = T;
template <class... Args> auto f(Args...) -> void {
y_t<Args...> v4; // Error
}
ऊपर कोड दोनों c++11
और g++ 4.9
में c++14
साथ त्रुटि (भले ही f
instantiated कभी नहीं किया गया है) उत्पन्न करता है, g++ 5.1
और clang 3.5
।
इसकी अनुमति क्यों नहीं है और सामान्य नियम क्या है? मुझे इसे प्रतिबंधित करने का कोई कारण नहीं है। यह एक बहुत अजीब निषेध लगता है।
क्यों पहले संस्करण के साथ x_fix_t
के रूप में लिखना क्यों नहीं है यह अधिक स्पष्ट है कि x_t
में एक अनिवार्य पहला तर्क है। (उदाहरण के लिए f()
का कारण नहीं है)। लेकिन यह इतना महत्वपूर्ण नहीं है, फिक्स आसान है। सवाल बनी हुई है: क्यों?
जीसीसी त्रुटि:
error: pack expansion argument for non-pack parameter ‘T’ of
alias template ‘template<class T, class ... Args> using x_t = typename x::type’
बजना त्रुटि:
error: pack expansion used as argument for non-pack parameter of
alias template x_t<Args...> v2;
यहां जानकारी प्रासंगिक है, मुझे लगता है: http://stackoverflow.com/q/24433658/4326278 – bogdan
इसके अलावा, इसके लायक होने के लिए, एमएसवीसी 12 और 14 आरसी इसे बिना किसी निदान के संकलित करता है (बिना किसी संदर्भ के सामान्य चेतावनियों से अलग चर) - "कार्यान्वयन भिन्नता", जैसा कि वे कहते हैं। – bogdan
जी ++ 4.8.2 में ठीक काम करता है। –