1
template<typename T> 
class C 
{ 
    void f() { } 
}; 

/*template<typename T> 
void C<T*>::f() { }*/ 

template<> 
void C<int*>::f() { } 

如果我们删除注释,代码将不会编译。我知道这一点(我也知道,我们应该有partial specializationC<T*>),但我无法找到标准中的单词,这就解释了这种行为。我重读了几次标准的14 par。你能给我一个标准的报价或标准,这解释了这一点吗?成员模板专业化

编辑。

template<typename T> 
class C 
{ 
    template<typename U> 
    struct S { }; 
}; 
// #1 
/*template<typename T> 
class C<T*> 
{ 
    template<typename U> 
    struct S { }; 
};*/ 
// #2 
/*template<typename T> 
template<typename U> 
struct C<T*>::S<U*> { };*/ 

template<> 
template<typename U> 
struct C<int*>::S<U*> { }; 

如果我们只删除下一条注释然后#2 - 代码将不会编译。

回答

1

下面是关于什么的,可以专门expliclitly标准报价,从14.7.3/1:

的下列任何一种明确的分工:

- 函数模板

- 类模板

- 类模板的成员函数

- 类模板的静态数据成员

- 构件类的类模板的

- 类模板的成员枚举

- 类或类模板的成员类模板

- 类或类模板的成员函数模板

可以通过声明intro由template<>;

除非明确允许,你不能部分专门化任何东西,并且类模板的成员函数没有明确的允许。只有类模板可能会部分专用(如14.5.5所述)。

(请注意,明确专用的类模板的成员类模板本身就是一个类模板。)

+0

我更新了问题。更新示例的答案是正确的? – ForEveR

+0

@ForEveR:我认为是。重点是在#2编辑的例子中,'template struct C :: S'是* not *类模板。 –

+0

好的。但为什么?为什么如果我们有这个部分规范 - 例子是正确的? – ForEveR