2010-11-11 13 views
7

का टेम्पलेट कन्स्ट्रक्टर विशेषज्ञता 14 दिनों के कई हफ्तों के कारण मेरा दिमाग पिघल गया है।टेम्पलेट कक्षा

मेरे पास एक टेम्पलेट वर्ग है, और मैं इस वर्ग के लिए एक टेम्पलेट कन्वर्टर कन्स्ट्रक्टर लिखने की कोशिश कर रहा हूं, और उस निर्माता को विशेषज्ञ बना रहा हूं। कंपाइलर (एमएसवीसी 9) मेरे साथ काफी नाराज है। यह वास्तविक कोड का एक न्यूनतम उदाहरण है जिसे मैं लिखने की कोशिश कर रहा हूं। कंपाइलर त्रुटि कोड के साथ इनलाइन है।

मुझे अपने दिमाग को बेकार करने में मदद करें। मैं जो करने की कोशिश कर रहा हूं उसे करने के लिए मुझे सिंटैक्स क्या है? नोट: मेरे असली कोड में, मैं घोषणा के बाहर कनवर्ट कन्स्ट्रक्टर को परिभाषित करना होगा, इसलिए यह मेरे लिए कोई विकल्प नहीं है।

#include <string> 
#include <sstream> 
using namespace std; 

template<typename A> 
class Gizmo 
{ 
public: 
    Gizmo() : a_() {}; 
    Gizmo(const A& a) : a_(a) {}; 
    template<typename Conv> Gizmo(const Conv& conv) : a_(static_cast<A>(conv)) {}; 

private: 
    A a_; 
}; 

// 
// ERROR HERE: 
// " error C2039: 'Gizmo<B>' : is not a member of 'Gizmo<A>'" 
// 
template<> template<typename B> Gizmo<string>::Gizmo<typename B>(const B& b) 
{ 
    stringstream ss; 
    ss << b; 
    ss >> a_; 
} 

int main() 
{ 
    Gizmo<int> a_int; 
    Gizmo<int> a_int2(123); 
    Gizmo<string> a_f(546.0f); 

    return 0; 
} 
+0

भावी पाठकों के लिए, मैंने अपनी मूल समस्या में उदार 'टाइपनाम' को हटा दिया है। –

उत्तर

7
template<> template<typename B> Gizmo<string>::Gizmo(const B& b) 

भी ध्यान रखें कि const typename B&से typename कीवर्ड हटाया जाना चाहिए।

+1

मुझे नहीं पता कि यह एमएसवीसी पर कैसा है, लेकिन 'जी ++' संकलित नहीं होगा अगर यह 'बी और बी' नहीं है। – kennytm

+1

मेरा दिमाग आप दोनों धन्यवाद! आसान प्रतिनिधि, आह? मैं केवल आसान सवाल पूछता हूं। :) –

+1

@ जॉन: थोड़ी देर में आपको अपने मस्तिष्क को थोड़ा ढीला करना चाहिए। 14 घंटे के दिनों तक लंबे समय तक संपर्क हानिकारक हो सकता है। –

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