typedef默认模板类型为同名

时间:2011-08-11 07:23:12

标签: c++ templates typedef

原始问题: 我有一个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是非法的。抱歉带宽。

1 个答案:

答案 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;
};