S<void,int> sv; // uses Template at (2)
但是
S<void,char> e2;
//uses (1) when im thinking it would use (2) especialization as well
任何人都可以解释这种行为吗? btw以下代码中的所有评论都来自书籍作者
非常感谢你!template<typename T>
class Types {
public:
typedef int I;
};
template<typename T, typename U = typename Types<T>::I>
class S; // (1)
template<>
class S<void> { // (2)
public:
void f();
};
template<> class S<char, char> {}; // (3)
template<> class S<char, 0>; // ERROR: 0 cannot substitute U
int main()
{
S<int>* pi; // OK: uses (1), no definition needed
S<int> e1; // ERROR: uses (1), but no definition available
S<void>* pv; // OK: uses (2)
S<void,int> sv; // OK: uses (2), definition available
S<void,char> e2; // OK: uses (1), definition available
S<char,char> e3; // ERROR: uses (3), but no definition available
}
答案 0 :(得分:3)
为什么要使用(2)
?
(2)是S<void, int>
的专业化。你拥有的是S<void, char>
。类型不同,因此不使用专业化。专业化仅在与完全匹配时才适用。 “将char隐式提升为int”并不够好。如果S<void, char>
没有专门化,那么它将使用通用的非专用版本。