原始问题: 我有一个template <typename CostType> struct Key
类型,我在另一个类UQueue
中使用了CostType
,它也在Key<CostType>
上模板化。我不想在这个课程中指定typedef Key<CostType> Key
。我试过template <typename T>
class C1 {
T t;
};
template <typename T>
class C2 {
typedef C1<T> C1;
C1 c1;
};
,但没有用。还有另一种解决方法吗?
编辑:本来会出现问题的最小例子(如果有的话)就是这样的:
{{1}}
但是,这有效(使用MSVC 2010 )。我的代码中还有一些其他错误让我误以为typedef是非法的。抱歉带宽。
答案 0 :(得分:0)
使用宏。这就是我一直这样做的原因,因为它简单易维护。
采取这种情况:
template <typename A, size_t B, int C, pointer_to_some_func D> class tTemplate
{
struct myStruct
{
int i, j;
};
void function1 (tTemplate <A, B, C, D> :: myStruct S);
void function2 ();
};
template <typename A, size_t B, int C, pointer_to_some_func D> void tTemplate <A, B, C, D> :: function1 (tTemplate <A, B, C, D> :: myStruct S)
{
}
等等......
想象一下,如果我必须更改参数或添加另一个参数......
现在,有了这个:
#define dTemplate tTemplate <A, B, C, D>
#define sTemplate template <typename A, size_t B, int C, pointer_to_some_func D>
sTemplate void dTemplate :: function1 (dTemplate::myStruct S)
{
}
易于维护,可供其他类\模板等使用。一个模板参数更改=一个适用于所有地方的宏更改。它的眼睛也更好。 此外,我发现模板中的一件好事,特别是因为typedef是不行的。 关于宏的最好的事情,甚至IF typedef都是标准:你不需要为它们做前瞻声明......永远! (是的,宏是邪恶的,但在像theese这样的情况下,它们不仅仅是有用的)
至于你的例子:
#define dC1 C1 <T> // no ";" !!!
template <typename T> class C1
{
T t;
};
template <typename T> class C2
{
dC1 c1;
};