类外部声明的c++类依赖类型

c++ class dependant typedef declared outside class

本文关键字:依赖 类型 c++ 外部 声明      更新时间:2023-10-16

我有两个类,我称之为类a和类b。

在类a中,我定义了一些类型,如T5。
在类b中,我使用类a中定义的这些类型。

为了避免写

typename classA<T1,T2>::T5

在我的代码中,我想创建一个类独立的类型,我可以直接调用它的名字templatedClassA在这个例子中。模板参数仍然是参数化的,我将在将来的项目中使用类a和类b定义它们。

#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'.

我做错了什么?

模板不能在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别名,如另一个答案所示。

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

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