объявление шаблона 'typedef typename FooT :: Bar Bar'

17

Мне очень сложно объявить шаблонный тип, как показано ниже.

#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 через мой код.

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

    
задан geraldCelente 05.10.2013 в 01:10
источник

4 ответа

29

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

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

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

Bar<int> x;   // is a Foo<int>::Bar
    
ответ дан Kerrek SB 05.10.2013 в 01:14
источник
5

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

template <class T>
using Bar = typename Foo<T>::Bar;
    
ответ дан Praetorian 05.10.2013 в 01:14
источник
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;
}
    
ответ дан Dietmar Kühl 05.10.2013 в 01:14
источник
0

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

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

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

...

MAP_THREADS(T) mapThreads;

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

    
ответ дан schenken 25.10.2016 в 22:11
источник