命令在类模板中的函数的专门化中是否重要

flo*_*ads 3 c++ templates specialization template-specialization

考虑类似......

template<typename T>
class Vector {
  ...
  bool operator==( const Vector<float> &rhs ) {
    // compare and return
  }

  bool operator==( const Vector<T> &rhs ) {
    // compare and return
  }
  ...
 };
Run Code Online (Sandbox Code Playgroud)

注意专业化如何高于非专业版.如果我将专业版本放在非专业版本之下,那么Vector<float>==比较仍然可以按预期工作吗?出于某种原因,我想我还记得,如果你在这个场景中使用下面的专业化,那么当编译器查看标题时,它将首先看到默认值,看它是否有效,并使用它.

Joh*_*itb 7

您的示例代码不是专门的,而是重载.顺序很重要(尽管不在你的代码中),因为函数需要在C++中知道之前声明.因此,如果一个重载调用另一个,或者中间的另一个函数调用过载集,则调用可能会在某个不需要的地方结束.您的示例代码有效且通用.

出于某种原因,我想我还记得,如果你在这个场景中使用下面的专业化,那么当编译器查看标题时,它将首先看到默认值,看它是否有效,并使用它.

您正在考虑以下规则

如果模板,成员模板或类模板的成员是明确专用的,则应在首次使用该特化之前声明该特化,这将导致发生隐式实例化,在发生此类使用的每个翻译单元中; 无需诊断.

我不能不引用标准中关于专业化的热闹说法

根据显式专业化声明的相对位置及其在翻译单元中的实例化点(如上下文所述),可以影响程序是否格式良好.写专业时,要注意它的位置; 或者使它编纂将是一种试图点燃其自焚的试验.