我认为不同之处在于,当您执行以下第一个(有效)显式专业化时f
:
template <>
void Foo<char,int>::f() {}
您正在对Foo<char,int>
. 但是当您尝试使用以下方法进行部分专业化时:
template <typename T>
void Foo<T,int>::f()
{
}
编译器需要Foo<T,int>
在进行特化之前隐式实例化,但由于T
. 它失败了。
您可以使用以下代码检查是否属于这种情况:
template <typename T, typename S>
class Foo
{
public:
void f(){}
void g(){}
};
template <>
void Foo<char,int>::f() //line 11
{}
template <>
class Foo<char,int> //line 15
{};
它g++
给出了错误:
test.cpp:15:7: error: specialization of ‘Foo<char, int>’ after instantiation
test.cpp:15:7: error: redefinition of ‘class Foo<char, int>’
test.cpp:2:7: error: previous definition of ‘class Foo<char, int>’
Withclang++
更清楚一点:
test.cpp:15:7: error: explicit specialization of 'Foo<char, int>' after instantiation
class Foo<char,int>
^~~~~~~~~~~~~
test.cpp:11:6: note: implicit instantiation first required here
void Foo<char,int>::f()
^