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

19

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

#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 ответа

30

Объявление 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
источник
  • Спасибо! все вы были одинаково полезны. Хотел бы я принять все три ответа. В любом случае, я проголосую за все три ответа. –  geraldCelente 05.10.2013 в 01:21
  • @geraldCelente: Я не думаю, что это важно, или кто-то был бы расстроен - выберите любой ответ, который вы найдете наиболее полезным :-) (Или бросьте монету.) –  Kerrek SB 05.10.2013 в 01:24
  • есть ли библиотека (например, boost), которая обеспечивает «backaround» для компиляторов, которые все еще падают с подлости C ++ 11 (например, компиляторы gcc / mingw)? –  Brian Jack 08.11.2014 в 15:44
6

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

template <class T>
using Bar = typename Foo<T>::Bar;
    
ответ дан Praetorian 05.10.2013 в 01:14
источник
  • Спасибо! все вы были одинаково полезны. Хотел бы я принять все три ответа. В любом случае, я проголосую за все три ответа. –  geraldCelente 05.10.2013 в 01:22
6

Вы не можете создать файл 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
источник
  • Спасибо! все вы были одинаково полезны. Хотел бы я принять все три ответа. В любом случае, я проголосую за все три ответа. –  geraldCelente 05.10.2013 в 01:22
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
источник