原始问题: 我有一个类型 template <typename CostType> struct Key
我在另一个类(class)使用 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;
};
但是,这有效(使用 MSVC 2010)。我的代码中还有其他一些错误,这让我误以为 typedef 是非法的。对带宽感到抱歉。
最佳答案
使用宏。我总是这样做,因为它简单且易于维护。
以这种情况为例:
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 是行不通的。 关于宏的最好的事情,即使 typedef 是一个标准:你不需要它们的前向声明......永远! (是的,宏是邪恶的,但在这些情况下,它们非常有用)
至于你的例子:
#define dC1 C1 <T> // no ";" !!!
template <typename T> class C1
{
T t;
};
template <typename T> class C2
{
dC1 c1;
};
关于c++ - typedef 默认模板类型为同名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7022242/