c++ - typedef 默认模板类型为同名

标签 c++ templates typedef

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

相关文章:

c++ - 64 位 Vivek 的虚拟相机

C++ 错误 : expected primary expression before '*' token in constructor with parameters

php - 标准 HTML 和 CSS 到 wordpress 页面

c++ - 将 'typedef' 从基类传播到 'template' 的派生类

c++ - 在结构中指定设备特定功能

c - 为什么 GCC 给我这个 `-Wdiscarded-qualifiers` 警告?

简化命名类型的 C++ 语言功能(特别是在函数声明中)

c++ - 在 1 个函数中打印对三角形递归 C++

c++ - 模板化成员函数中的模板化参数类型

c# - 非托管代码中 System.Diagnostics.Debugger.Launch() 的等效项是什么?