C++ 不会将主模板的定义用作类模板部分专用化的成员的定义。[……]

C++ 不会将主模板的定义用作类模板部分专用化的成员的定义。[……],c++,template-specialization,C++,Template Specialization,后者意味着不可能通过简单地给出其成员之一的定义来隐式地定义部分专门化:该成员的存在本身不会遵循主模板的定义,因此定义它等同于定义未声明的成员函数,这是不允许的(即使使用非模板类) 另一方面,类模板的成员函数存在显式专门化(或完全专门化,如您所称)的概念 (§14.7.3/1)以下任何一项的明确专门化: […] -类模板的成员函数 […] 可以通过模板引入的声明进行声明;[…] §14.7.3/14描述了以下细节: (§14.7.3/14)类模板的成员或成员模板可明确专用于类模板的给定隐式实例化,

后者意味着不可能通过简单地给出其成员之一的定义来隐式地定义部分专门化:该成员的存在本身不会遵循主模板的定义,因此定义它等同于定义未声明的成员函数,这是不允许的(即使使用非模板类)

另一方面,类模板的成员函数存在显式专门化(或完全专门化,如您所称)的概念

(§14.7.3/1)以下任何一项的明确专门化:
[…]
-类模板的成员函数
[…]
可以通过模板引入的声明进行声明;[…]

§14.7.3/14描述了以下细节:

(§14.7.3/14)类模板的成员或成员模板可明确专用于类模板的给定隐式实例化,即使该成员或成员模板是在类模板定义中定义的。[…]


因此,对于成员的显式专门化,类模板的其余部分的实例化是隐式的——它派生自主模板定义,或者任何部分专门化(如果已定义)。

几乎重复:而且。它确实很有帮助,事实上。谢谢:)这就是我一直在寻找的。无法解读标准的相关部分。谢谢:)
template <typename T, typename S>
class Foo
{
public:
    void f(){}
    void g(){}
};
template <>
void Foo<char,int>::f() {}
template <typename T, typename S>
void Foo<T,S*>::f()
{
}

template <typename T>
void Foo<T,int>::f()
{
}
template <>
void Foo<char,int>::f() {}
template <typename T>
void Foo<T,int>::f()
{
}
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
{};
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>’
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() 
     ^
template <typename T>
void Foo<T,int>::f()
{ }