我有两个类,我将其称为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'.
我做错了什么?
答案 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;