2013-10-04 4 views
18

У меня возникли трудности с объявлением шаблонного типа, как показано ниже.объявление шаблона `typedef typename Foo <T> :: Bar Bar '

#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; 

Я делаю это, потому что я хочу избежать написания имяТипа Foo :: Bar Повсеместно мой код.

Что я делаю неправильно?

ответ

29

Объявление typedef на C++ не может быть шаблоном. Тем не менее, C++ 11 добавлена ​​альтернативный синтаксис, используя using декларацию, чтобы параметризованные псевдонимами типа:

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

Теперь вы можете использовать:

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

Спасибо! все вы были одинаково полезны. Хотел бы я принять все три ответа. В любом случае, я проголосую за все три ответа. – geraldCelente

+2

@geraldCelente: Я не думаю, что это важно, или кто-то был бы расстроен - выберите любой ответ, который вы найдете наиболее полезным :-) (или бросьте монету). –

+0

есть библиотека (например, boost), которая обеспечивает «backaround» «для компиляторов, которые все еще падают с подлости C++ 11 (например, компиляторы gcc/mingw)? –

5

typedef «s не может быть шаблонов. Именно по этой причине C++ 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; 

к сожалению он не демонстрирует оригинальный пример, но вы получите дрейф.

Смежные вопросы