请考虑以下示例:
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)
那样使用。
答案 0 :(得分:3)
答案非常简单 - SFINAE在功能方面起作用。它不适用于他们的收容类。由于在第二种情况下,函数本身不是模板,因此在实例化类时会创建它们的实例 - 并且所有类型都必须正确。只能从重载决策中丢弃模板函数。
小插图。即使这段代码也无法编译:
matrix
根本没有调用此函数,但代码将无法编译 - 因为编译器将无法创建类实例所需的函数。