在类外声明的c ++类依赖typedef

时间:2014-05-04 13:22:17

标签: c++ templates typedef c++98

我有两个类,我将其称为classA和classB。

在classA中我定义了一些类型,例如T5 在classB中,我使用classA中定义的类型。

为了避免写作

typename classA<T1,T2>::T5

在我的代码中,我想创建一个类独立类型, 我可以通过它的名字 - templatedClassA直接调用它 在示例中。模板参数仍然是参数化的,我愿意 使用classA和classB在将来的项目中定义它们。

#include <cstdlib>
#include <iostream>

using namespace std;

//classA
template <class T1, class T2>
class classA
{
 public:  
 typedef T1 T5;
 classA();
};

template <class T1, class T2>
classA<T1,T2>::classA(){}
//end classA

template <class T1, class T2>
typedef classA<T1,T2> templatedClassA;

template <class T1, class T2>
typedef typename classA<T1,T2>::T5 T6;






//classB
template <class T3, class T4>
class classB
{
 public:
 classB();
};

template <class T3, class T4>
classB<T3,T4>::classB(){}
//end classB



int main(int argc, char *argv[])
{

    classB<int, double> classBInstance;

    system("PAUSE");
    return EXIT_SUCCESS;
}

编译上面的代码时,我得到以下两个错误:

template declaration of `typedef class classA<T1, T2> templatedClassA'
template declaration of `typedef typename classA<T1, T2>::T5 T6'.

我做错了什么?

2 个答案:

答案 0 :(得分:3)

模板无法在typedef声明中使用。你必须在这样的类中包装声明:

template <class T1, class T2>
class templatedClassA {
    typedef classA<T1, T2> type;
};

template <class T1, class T2>
class T6 {
   typedef typename classA<T1, T2>::T5 type;
};

在C ++ 11中,您可以使用using别名,如另一个答案所示。

答案 1 :(得分:1)

在C ++ 11中,您可以这样做:

template <class T1, class T2>
using templatedClassA = classA<T1, T2>;

template <class T1, class T2>
using T6 = typename classA<T1, T2>::T5;