Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ typedef默认模板类型为相同名称_C++_Templates_Typedef - Fatal编程技术网

C++ typedef默认模板类型为相同名称

C++ 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>

原始问题:我有一个type
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)拒绝编译它。“