模板重载和SFINAE只能处理函数而不能处理类

Lor*_*one 17 c++ templates sfinae c++11

有人可以解释为什么编译器只接受这个代码

template<typename L, size_t offset, typename enable_if< (offset<sizeof(L)), int >::type =0>
void a_function(){}

template<typename L, size_t offset, typename enable_if< (offset==sizeof(L)), int >::type =0>
void a_function(){}
Run Code Online (Sandbox Code Playgroud)

但不是这个:

template<typename L, size_t offset, typename enable_if< (offset<sizeof(L)), int >::type =0>
class a_class{};

template<typename L, size_t offset, typename enable_if< (offset==sizeof(L)), int >::type =0>
class a_class{};
Run Code Online (Sandbox Code Playgroud)

编译器将第二个类模板视为第一个类的重新定义.

jpa*_*cek 15

你必须使用专门化的类.通常,它使用额外的参数完成:

template <class P, class dummy = void>
class T;

template <class P>
class T<P, typename enable_if<something, void>::type> {
   the real thing
};
Run Code Online (Sandbox Code Playgroud)

具有相同名称的两个类(或类模板)声明应始终声明相同的类或类模板(或者是特化,在这种情况下它仍然是相同的模板).

  • @LightnessRacesinOrbit因为你可以重载函数,但不能重载类型.在函数版本中,您定义了两个潜在的重载(针对不同类型的集合),而在第二种情况下,您定义了两个具有相同名称但无法完成的模板.两个函数,一个名称很好(只要它们不含糊),两个具有相同名称的类型,不太好,即使它们实际上是类型模板. (2认同)