2012-12-20 15 views
6

मैं जीसीसी/4.7 का उपयोग कर रहा हूं और मुझे टेम्पलेट फ़ंक्शन (या सदस्य फ़ंक्शन) में टेम्पलेट-टेम्पलेट तर्क के साथ कक्षा को तुरंत चालू करने की आवश्यकता है। मैं निम्न त्रुटिटेम्पलेट टेम्पलेट कोड काम नहीं कर रहा है

test.cpp: In function 'void setup(Pattern_Type&)': 
test.cpp:17:34: error: type/value mismatch at argument 1 in template parameter list for 'template<template<class> class C> struct A' 
test.cpp:17:34: error: expected a class template, got 'typename Pattern_Type::traits' 
test.cpp:17:37: error: invalid type in declaration before ';' token 
test.cpp:18:5: error: request for member 'b' in 'a', which is of non-class type 'int' 

प्राप्त दो पंक्तियों स्निपेट में चिह्नित कोड चलाता टिप्पणी करके, तो एक एक 'मुख्य' लेकिन 'सेटअप' नहीं में में instantiated जा सकता है। मुझे लगता है कि यह दूसरों के लिए भी ब्याज की बात होगी, और मुझे यह समझने में खुशी होगी कि कोड क्यों काम नहीं करता है। यहां कोड

struct PT { 
    template <typename T> 
    struct traits { 
    int c; 
    }; 
}; 

template <template <typename> class C> 
struct A { 
    typedef C<int> type; 
    type b; 
}; 

template <typename Pattern_Type> 
void setup(Pattern_Type &halo_exchange) { 
    A<typename Pattern_Type::traits> a; // Line 17: Comment this 
    a.b.c=10; // Comment this 
} 

int main() { 
    A<PT::traits> a; 

    a.b.c=10; 

    return 0; 
} 

किसी भी सुझाव और ठीक करने के लिए धन्यवाद! मौरो

+0

एमएसवीसी 10 के तहत संकलित करता है। –

उत्तर

9

आप एक टेम्पलेट के रूप Pattern_Type::traits चिह्नित करने की आवश्यकता:

A<Pattern_Type::template traits> a; 

इसका कारण यह है कि यह टेम्पलेट पैरामीटर Pattern_Type पर निर्भर है की जरूरत है।

आपको typename का उपयोग भी नहीं करना चाहिए क्योंकि traits एक टेम्पलेट है, एक प्रकार नहीं।

+0

यह एक संयोजन है जिसे मैंने कोशिश नहीं की: टेम्पलेट के बिना टेम्पलेट। अभी भी मुझे स्पष्ट नहीं है कि 'मुख्य' में मुझे 'टेम्पलेट' निर्दिष्ट करने की आवश्यकता क्यों नहीं है। सुपर त्वरित उत्तर के लिए धन्यवाद! – user1919074

+1

@ user1919074: ऐसा इसलिए है क्योंकि 'मुख्य' में यह टेम्पलेट पैरामीटर पर निर्भर नहीं है (यानी 'पीटी' की सामग्री पहले ही ज्ञात है, लेकिन 'पैटर्न_Type' की सामग्री ज्ञात नहीं है क्योंकि यह कुछ भी हो सकती है)। अधिक जानकारी के लिए, देखें [मुझे और क्यों "टेम्पलेट" और "टाइपनाम" कीवर्ड डालना है?] (Http://stackoverflow.com/questions/610245/where-and-why-do-i-have- टू-द-टेम्पलेट-एंड-टाइपनाम-कीवर्ड) – interjay

+0

यह सही है, मुझे यह पता होना चाहिए था ... – user1919074

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