C++ typedef默认模板类型为相同名称
原始问题:我有一个typeC++ typedef默认模板类型为相同名称,c++,templates,typedef,C++,Templates,Typedef,原始问题:我有一个typetemplate struct Key,我在另一个类UQueue中使用它,它也在CostType上模板化。我不想在这个类中指定Key。我尝试了typedef Key,但没有成功。还有其他解决办法吗 编辑:显示问题(如果存在问题)的最小示例如下: template <typename T> class C1 { T t; }; template <typename T> class C2 { typedef C1<T>
template struct Key
,我在另一个类UQueue
中使用它,它也在CostType
上模板化。我不想在这个类中指定Key
。我尝试了typedef Key
,但没有成功。还有其他解决办法吗
编辑:显示问题(如果存在问题)的最小示例如下:
template <typename T>
class C1 {
T t;
};
template <typename T>
class C2 {
typedef C1<T> C1;
C1 c1;
};
模板
C1类{
T;
};
模板
C2类{
类型定义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)
{
}
模板类tTemplate
{
结构myStruct
{
int i,j;
};
void函数1(tTemplate::myStruct S);
无效函数2();
};
模板无效tTemplate::function1(tTemplate::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)
{
}
#定义数据模板tTemplate
#定义模板模板
sTemplate void dTemplate::function1(dTemplate::myStruct S)
{
}
易于维护,可供其他类\模板等使用。一个模板参数更改=适用于所有地方的宏更改。而且它对眼睛也更好。
此外,我发现它在模板中是一件好事,特别是因为typedef是不可能的。
关于宏最好的一点是,即使typedef是一个标准:它们不需要前向声明。。。曾经(是的,宏是邪恶的,但在像theese这样的情况下,它们非常有用)
至于你的例子:
#define dC1 C1 <T> // no ";" !!!
template <typename T> class C1
{
T t;
};
template <typename T> class C2
{
dC1 c1;
};
#定义dC1 C1//no”!!!
模板类别C1
{
T;
};
模板类C2
{
dC1 c1;
};
发布一些代码。。。。。。这两个类的定义,以及typedef。它到底是如何“不工作”的?你有编译器错误吗?如果是这样,它会说什么?虽然这个问题可能不是最好的(既不是语言也不是格式),但我认为它是可以理解的:用户不希望必须在不同的模板中指定模板参数。他试图添加一个typedef
,但失败了(@carlpett:这里你应该添加怎么做,它不起作用是什么意思?)这个可能会重新开放。仍然可以编辑已关闭的问题以获得更多重新打开的投票!根据@James Kanze的说法,这样的typedef实际上不太合适。我冒昧地在这里发表了他的评论,因为我删除了他评论的(错误)答案:“这是未定义的行为:§3.2.7/1(第2点):“在类s中使用的名称N在其上下文中以及在完成的s范围内重新评估时应指代相同的声明。违反此规则不需要诊断。”G++(至少在我使用的选项中,包括-std=c++98-pendantic)拒绝编译它。“