【问题标题】:typedef default template type to same nametypedef 默认模板类型为同名
【发布时间】:2011-08-11 07:23:11
【问题描述】:

原始问题: 我有一个类型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;
};

但是,这可行(使用 MSVC 2010)。我的代码中还有其他一些错误,让我误以为 typedef 是非法的。对不起带宽。

【问题讨论】:

  • 贴一些代码......两个类的定义,以及typedef。
  • 它究竟是如何“不工作”的?你有编译器错误吗?如果是这样,它说明了什么?
  • 虽然这个问题可能不是最好的(语言和格式都不是),但我认为可以理解:用户不想在不同的模板中指定模板参数。他试图添加一个typedef,但失败了(@carlpett:这里你​​应该添加如何它不起作用是什么意思?)我相信@Luc Touraille 和@Peter Alexander 理解了这个问题......
  • @Luc - 一个不好的问题应该尽快结束。 :-) 这个可能会重新打开。仍然可以编辑已关闭的问题以获得更多重新投票!
  • 好吧,根据@James Kanze 的说法,这样的 typedef 实际上并不是那么好。我冒昧地在这里发表他的评论,因为我删除了他评论的(错误)答案:“这是未定义的行为:§3.2.7/1(第 2 点):“在类 S 中使用的名称 N 应指在其上下文中以及在 S 的完整范围内重新评估时的相同声明。违反此规则不需要诊断。” G++(至少使用我使用的选项,包括 -std=c++98 -pendantic)拒绝编译它。”

标签: c++ templates typedef


【解决方案1】:

使用宏。这就是我一直这样做的方式,因为它简单且易于维护。

以这种情况为例:

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 typedefs 也是一个标准:你不需要为它们进行前向声明......永远! (是的,宏是邪恶的,但在这些情况下,它们不仅有用)

至于你的例子:

#define dC1 C1 <T>       // no ";" !!!

template <typename T> class C1
{
    T t;
};

template <typename T> class C2
{
    dC1 c1;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-18
    • 2015-03-17
    • 1970-01-01
    • 2012-08-12
    • 2020-09-19
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多