我在声明模板化类型时遇到了很大困难,如下所示。
#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。
我做错了什么?
答案 0 :(得分:33)
C ++中的typedef
声明不能是模板。但是,C ++ 11使用using
声明添加了另一种语法,以允许参数化类型别名:
template <typename T>
using Bar = typename Foo<T>::Bar;
现在你可以使用:
Bar<int> x; // is a Foo<int>::Bar
答案 1 :(得分:7)
typedef
不能是模板。这正是C ++ 11发明别名模板的原因。尝试
template <class T>
using Bar = typename Foo<T>::Bar;
答案 2 :(得分:7)
你不能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;
}
答案 3 :(得分:0)
希望可以添加迟到的答案......
我还在使用VS2012,它似乎没有实现别名模板,所以我为了我的目的使用了这个混合物:
//map<CWinThread*, AKTHREADINFO<T> > mapThreads; // won't compile
#define MAP_THREADS(T) map<CWinThread*, AKTHREADINFO<T> >
...
MAP_THREADS(T) mapThreads;
很抱歉,它没有展示原始示例,但是你得到了漂移。