2013-10-04 20 views
18

का टेम्प्लेट घोषणा मुझे नीचे दिखाए गए टेम्पलेट प्रकार की घोषणा करने में बड़ी कठिनाई का सामना करना पड़ रहा है।`typedef typename foo <T> :: बार बार '

#include <cstdlib> 
#include <iostream> 

using namespace std; 


template <class T> 
class Foo 
{ 
typedef T Bar; 
}; 

template <class T> 
typedef typename Foo<T>::Bar Bar; 




int main(int argc, char *argv[]) 
{ 

    Bar bar; 

    Foo<int> foo; 


    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

मैं त्रुटि

template declaration of `typedef typename Foo<T>::Bar Bar' 

लाइन

template <class T> 
typedef typename Foo<T>::Bar Bar; 

के बारे में मैं यह कर रहा हूं क्योंकि मैं लिख typename फू :: बार मेरी कोड सोचा से बचने चाहते हैं।

मैं क्या गलत कर रहा हूं?

उत्तर

29

typedef सी ++ में घोषणा टेम्पलेट नहीं हो सकता है।

template <typename T> 
using Bar = typename Foo<T>::Bar; 

अब आप उपयोग कर सकते हैं:

Bar<int> x; // is a Foo<int>::Bar 
+0

धन्यवाद! आप सभी समान रूप से सहायक रहे हैं। काश मैं प्राप्त तीनों उत्तरों को स्वीकार कर सकता हूं। वैसे भी मैं सभी तीन उत्तरों को वोट दूंगा। – geraldCelente

+2

@geraldCelente: मुझे नहीं लगता कि यह मायने रखता है या कोई परेशान होगा - जो भी जवाब आपको सबसे उपयोगी लगता है :-) (या सिक्का टॉस करें।) –

+0

क्या एक पुस्तकालय है (उदाहरण: बूस्ट) जो "बैकअराउंड" प्रदान करता है "उन कंपाइलरों के लिए जो अभी भी सी ++ 11 बैंडवैगन (जीसीसी/मिंगव कंपाइलर्स की तरह) से गिर रहे हैं? –

5

typedef के टेम्पलेट्स नहीं किया जा सकता हालांकि, सी ++ 11 एक वैकल्पिक वाक्य रचना using घोषणा का उपयोग कर parametrized प्रकार उपनाम अनुमति देने के लिए जोड़ा गया। यही कारण है कि सी ++ 11 ने उपनाम टेम्पलेट का आविष्कार किया।

template <class T> 
using Bar = typename Foo<T>::Bar; 
+0

धन्यवाद! आप सभी समान रूप से सहायक रहे हैं। काश मैं प्राप्त तीनों उत्तरों को स्वीकार कर सकता हूं। वैसे भी मैं सभी तीन उत्तरों को वोट दूंगा। – geraldCelente

5

आप typedef टेम्पलेट नहीं कर सकते हैं। हालांकि, आप उपनाम टेम्पलेट का उपयोग कर सकते हैं। नीचे दिए गए कोड का उपयोग करें, भी दर्शाता है और तय कुछ अन्य समस्याओं:

template <class T> 
class Foo 
{ 
public: 
    typedef T Bar; 
}; 

template <class T> 
using Bar = typename Foo<T>::Bar; 

int main(int argc, char *argv[]) 
{ 
    Bar<int> bar; 
    Foo<int> foo; 
} 
+0

धन्यवाद! आप सभी समान रूप से सहायक रहे हैं। काश मैं प्राप्त तीनों उत्तरों को स्वीकार कर सकता हूं। वैसे भी मैं सभी तीन उत्तरों को वोट दूंगा। – geraldCelente

0

आशा है कि यह देर से जवाब जोड़ने के लिए ठीक है ...

मैं अभी भी VS2012 जो उर्फ ​​टेम्पलेट्स लागू करने के लिए प्रकट नहीं होता है उपयोग कर रहा हूँ , इसलिए मैं अपने प्रयोजनों के लिए इस मिश्रण का सहारा लिया:

//map<CWinThread*, AKTHREADINFO<T> > mapThreads; // won't compile 
#define MAP_THREADS(T) map<CWinThread*, AKTHREADINFO<T> > 

... 

MAP_THREADS(T) mapThreads; 

क्षमा करें यह मूल उदाहरण प्रदर्शित नहीं करता है, लेकिन आप बहाव मिलता है।

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