2012-03-14 13 views
6
struct Messages 
{ 
     template <typename V> 
     static const char* message() {return "test mesage";} 
}; 

template <int Min, class M=Messages> 
struct Test: public M 
{ 
    Test() 
    { 
     M::message<int>(); //error: expected primary-expression before 'int' 
    } 
}; 

int main() 
{ 
    Test<5, Messages> t; 
} 

ली गई है कि मुझे लगता है इस टेस्ट के कोड की तरह, कुछ आपसी निर्भरता से कोई लेना देना नहीं है आधार वर्ग एम जिसका विधि के अंदर विशेष है पर निर्भर करता है की एक टेम्प्लेटेड विधि क्यों कॉल नहीं कर सकते परीक्षा। क्या ये सही है?मैं एक टेम्पलेट वर्ग से

उत्तर

7

M::messageM एक आश्रित तर्क है क्योंकि एक आश्रित नाम है। संकलक कि एक आश्रित नाम अपने आप में एक टेम्पलेट है पता नहीं कर सकते हैं, इसलिए आप इस स्पष्ट रूप से निर्दिष्ट करना होगा:

M::template message<int>(); 

अन्यथा संकलक कोड को पार्स करता है जैसे कि M::message एक मूल्य है, जो निम्नलिखित कोण एक अलग अर्थ कोष्ठक (देता थे यानी वे ऑपरेटरों की तुलना में छोटे से अधिक और अधिक के रूप में पार्स किए जाते हैं, न कि टेम्पलेट सूची डिलीमीटर के रूप में)। संकलक ऐसे गलत पार्स से ठीक नहीं हो सकता है।

+0

धन्यवाद, यही वह है। मैं आश्रित नामों को असंबद्ध करने के लिए 'टेम्पलेट' कीवर्ड के इस उपयोग को नहीं जानता था। –

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