【问题标题】:Is it possible to overload a template class?是否可以重载模板类?
【发布时间】:2010-10-29 03:06:57
【问题描述】:

我发现模板方法可能被重载,我可以在模板类上做同样的事情吗?如果有2个模板类匹配一个模板类实例化,我们可以使用构造函数中的参数类型来推断使用哪一个。

template <typename T>
class A{
  A(T){}
};

template <typename T>
class A{
  A(T*){}
};

int main(){
  A<int*> a((int*)0);
  A<int> a((int*)0);
  return 0;
}

【问题讨论】:

  • 请注意:反引号语法用于内联代码。当你想格式化代码块时,每行缩进四个空格。 daringfireball.net/projects/markdown
  • 模板类可以专门化(部分或完全)
  • @Jonathan Sterling,感谢您的提示。如何缩进 4 个空格的块代码?似乎整个块上的选项卡不起作用。有什么捷径可以做到这一点吗?还是我需要逐行插入空格?
  • Tan:4 个空格不是重点。关键是代码 sn-p 应该至少看起来像带有一些缩进的代码。使用工具栏中的“101”图标
  • 选择代码行并按 ctrl-k(或 101 按钮)是处理代码清单的最佳方式。

标签: c++ templates overloading specialization


【解决方案1】:

没有。这是不允许的。相反,类模板可以被特化(包括部分特化)。这样就差不多达到了重载的效果(只针对函数)

请注意,模板参数不能从构造函数参数中推导出来。

template<class T> struct X{
   void f(){}
};

template<class T> struct X<T*>{
   void f(){}
};

int main(){
   X<int> x;
   x.f();          // calls X<T>::f

   X<int *> xs;
   xs.f();         // calls X<T*>::f
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 2012-03-17
    • 2014-01-12
    • 1970-01-01
    • 2021-07-25
    相关资源
    最近更新 更多