SFINAE:当成员函数不是模板时,没有名为'type'的类型

时间:2015-10-29 21:09:17

标签: c++ sfinae

请考虑以下示例:

template <typename T>
struct Boo {

    template <typename K = T>
    static typename enable_if<is_same<K, X1>::value, void>::type foo (int, int) {}

    template <typename K = T>
    static typename enable_if<is_same<K, X2>::value, void>::type foo (int) {}
};

template <typename T>
struct Goo {
    static typename enable_if<is_same<T, X1>::value, void>::type foo (int, int) {}

    static typename enable_if<is_same<T, X2>::value, void>::type foo (int) {}
};

用法:

Boo<X1>::foo (1, 1);
Boo<X1>::foo (1);       // (1)
Boo<X2>::foo (5);
Boo<X2>::foo (5, 5);    // (2)

Goo<X1>::foo (1, 2);    // (3)
Goo<X2>::foo (2);       // (4)

(1)和(2)不编译,这是我想要的,但有人可以解释为什么(3)和(4)无法编译?因此,如果Goo::foo (int, int)Goo::foo (int)不是模板,为什么不能像Boo::foo (int, int)Boo::foo (int)那样使用。

1 个答案:

答案 0 :(得分:3)

答案非常简单 - SFINAE在功能方面起作用。它不适用于他们的收容类。由于在第二种情况下,函数本身不是模板,因此在实例化类时会创建它们的实例 - 并且所有类型都必须正确。只能从重载决策中丢弃模板函数。

小插图。即使这段代码也无法编译:

matrix

根本没有调用此函数,但代码将无法编译 - 因为编译器将无法创建类实例所需的函数。