2011-09-13 21 views
21

अस्वीकरण के भीतर टेम्पलेट फ़ंक्शन कॉल करना अस्वीकरण: निम्न प्रश्न शायद इतना आसान है कि मैं पहले जवाब को देखकर चौंक गया। इसके अलावा, मैं किसी भी डुप्लिकेट प्रश्नों के लिए माफ़ी मांगना चाहता हूं - सिंटैक्टिक समस्याओं को मौखिक स्पष्टीकरण की पहचान करना हमेशा आसान नहीं होता है और इस प्रकार उनके लिए खोज करना आसान नहीं है ...टेम्पलेट वर्ग

लेकिन पर्याप्त है। मेरे पास दो टेम्पलेटेड क्लास हैं, उनमें से एक में टेम्पलेट सदस्य फ़ंक्शन है, अन्य क्लास उस फ़ंक्शन को कॉल करने का प्रयास करती है। एक न्यूनतम उत्पादन त्रुटि उदाहरण नीचे दिखाया गया है:

#include <iostream> 

template <typename T> 
class Foo { 
public: 
    Foo() { 
    } 

    template <typename outtype> 
    inline outtype bar(int i, int j, int k = 1) { 
     return k; 
    } 

}; 

template <typename T> 
class Wrapper { 
public: 
    Wrapper() { 
    } 

    double returnValue() { 
     Foo<T> obj; 
     return obj.bar<double>(1,2); // This line is faulty. 
    } 

}; 

int main() { 
    Wrapper<char> wr; 
    double test = wr.returnValue(); 
    std::cout << test << std::endl; 
    return 0; 
} 

संकलन समय, इस

expected primary-expression before 'double' 
expected ';' before 'double' 
expected unqualified-id before '>' token 

जहां सभी त्रुटि संदेश linke कोड में चिह्नित के निर्देश पर कर रहे हैं का परिणाम है।

मैं आपके विचारों के लिए पहले ही धन्यवाद देता हूं, इससे कोई फर्क नहीं पड़ता कि वे कितने स्पष्ट हैं।

+0

इसकी योग्यता के कारण स्पष्ट योग्यता की आवश्यकता नहीं है। टेम्पलेट के बिना हमें एक वाक्यविन्यास त्रुटि मिलती है, जिसे माना जाएगा <क्योंकि ऑपरेटर कम से कम है .... "13.6 स्ट्रास्ट्रुप, स्पेक संस्करण 935-936 में भाषा लेखक के दृष्टिकोण को भी देखें।" – bruziuz

उत्तर

36
obj.bar<double>(1,2); // This line is faulty. 

template कीवर्ड यहाँ की आवश्यकता है, के रूप में obj एक प्रकार Foo<T> जो पर निर्भर करता है टेम्पलेट पैरामीटर T का एक उदाहरण है, और इसलिए ऊपर लिखा जाना चाहिए के रूप में:

obj.template bar<double>(1,2); //This line is corrected :-) 

पढ़ें @ विस्तार विवरण के लिए जोहानिस का जवाब यहाँ:

4

इतनी बार: प्रश्न पोस्ट होने के बाद, जवाब स्वयं ही आया।

return obj.template bar<double>(1,2); 

को दोषपूर्ण लाइन को ठीक अपेक्षित परिणाम अर्जित करता है।

पढ़ने के लिए धन्यवाद ...

3

इस foo.template bar‹ double > का मामला हो सकता है?

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