Объявление шаблона `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 через мой код.
Что я делаю неправильно?
Ответы
Ответ 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;
Извините, но не показывает оригинальный пример, но вы получаете дрейф.