30

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

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

我这样做是因为我想避免通过我的代码编写类型名 Foo::Bar。

我究竟做错了什么?

4

4 回答 4

43

C++ 中的typedef声明不能是模板。但是,C++11 使用声明添加了一种替代语法using以允许参数化类型别名:

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

现在您可以使用:

Bar<int> x;   // is a Foo<int>::Bar
于 2013-10-04T23:14:03.070 回答
9

typedef的不能是模板。这正是 C++11 发明别名模板的原因。尝试

template <class T>
using Bar = typename Foo<T>::Bar;
于 2013-10-04T23:14:31.150 回答
9

你不能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;
}
于 2013-10-04T23:14:55.713 回答
1

希望可以添加迟到的答案...

我仍在使用似乎没有实现别名模板的 VS2012,所以我出于我的目的使用了这种混合物:

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

...

MAP_THREADS(T) mapThreads;

抱歉,它没有演示原始示例,但您明白了。

于 2016-10-25T20:11:57.500 回答