`typedef typename Foo <t> :: Bar Bar'的模板声明</t>

时间:2013-10-04 23:10:36

标签: c++ templates typedef typename

我在声明模板化类型时遇到了很大困难,如下所示。

#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。

我做错了什么?

4 个答案:

答案 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;

很抱歉,它没有展示原始示例,但是你得到了漂移。