Подтвердить что ты не робот

Объявление шаблона `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;

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

typedef не могут быть шаблонами. Именно по этой причине С++ 11 изобрел шаблоны псевдонимов. Попробуйте

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

Ответ 3

Вы не можете 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;
}

Ответ 4

Надеюсь, что будет добавлено более поздние ответы...

Я все еще использую VS2012, который, похоже, не реализует шаблоны псевдонимов, поэтому я прибегал к этой смеси для моих целей:

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

...

MAP_THREADS(T) mapThreads;

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