2010-10-22 7 views
6

फोन करने के लिए:सिंटेक्स मैं सोच रहा हूँ फोन करने के लिए उचित सिंटैक्स टेम्पलेट विधि के रूप में दिया क्या टेम्प्लेटेड विधि

struct print_ch { 
    print_ch(char const& ch) : m_ch(ch) { } 
    ~print_ch() { } 
    template<typename T> 
    void operator()() { 
     std::cout << static_cast<T>(m_ch) << std::endl; 
    } 
    private: 
    char m_ch; 
}; 

मैं इस तरह sth के साथ आया था:

print_ch printer('c'); 
printer.operator()<int>(); 

और यह काम करने के लिए लगता है (जीसीसी 4.5), लेकिन जब मैं इसे एक और टेम्प्लेटेड विधि के अंदर उपयोग करते हैं, उदाहरण के लिए:

struct printer { 

    typedef int print_type; 

    template<typename T_functor> 
    static void print(T_functor& fnct) { 
     fnct.operator()<print_type>(); 
    } 

}; 

संकलन +०१२३००२९५८६ के साथ विफल। इसे सही करने के लिए कोई विचार? अग्रिम में धन्यवाद।

fnct.template operator()<print_type>(); 

आप template कीवर्ड के साथ इस निर्दिष्ट नहीं करते हैं संकलक समझेंगे कि operator() सिर्फ एक है:

+4

यह बहुत करने के लिए क्लीनर है बस एक नियमित समारोह बनाएँ। ऑपरेटरों को कम से कम और जब उचित हो, इस्तेमाल किया जाना चाहिए। – JoshD

+0

@ जोशड धन्यवाद, ऐसा लगता है कि आप सही हैं, मुझे इस – erjot

+0

पर पुनर्विचार करना होगा, वास्तव में, 'ऑपरेटर()' ओवरलोडिंग यहां समझ में नहीं आता है, क्योंकि इसे नियमित फ़ंक्शन के समान वाक्यविन्यास के साथ नहीं कहा जा सकता है, जो पूरी तरह से उद्देश्य को हरा देता है। – UncleBens

उत्तर

8

आप स्पष्ट रूप से संकलक बताने के लिए कि टेम्प्लेटेड fnct की operator() अपने आप में एक टेम्पलेट है सामान्य विधि, टेम्पलेट नहीं।

+0

ठीक है, अब यह बहुत स्पष्ट दिखता है - धन्यवाद! – erjot

2

के बाद से T_functor अपने आप में एक टेम्पलेट, संकलक (या पार्सर) यह के सदस्यों के बारे में कुछ भी नहीं पता करने के लिए मान लिया गया है, तो आप explicetly यह बताने के लिए आप किसी टेम्पलेट methode का उपयोग बुला रहे हैं है:

 fnct.template operator()<print_type>(); 
संबंधित मुद्दे