成员函数的部分特化

时间:2012-09-09 01:10:10

标签: c++ templates template-specialization partial-specialization

  

可能重复:
  “invalid use of incomplete type” error with partial template specialization

为什么我能这样做:

template <typename T>
struct A
{
    void foo(int);
};

template <>
void A<int>::foo(int)
{
}

但不是这样:

template <typename> struct C {};

template <typename T>
struct A
{
    void foo(int);
};

template <typename T>
void A<C<T> >::foo(int)
{
}

对于第二种情况,GCC给出以下错误:

test.cpp:10:23: error: invalid use of incomplete type 'struct A<C<T> >'
test.cpp:4:8: error: declaration of 'struct A<C<T> >'

修改

在解释为什么不允许第二个例子时,请同时考虑使成员函数也是一个模板对哪个例子有效,哪个没有影响。也就是说,这仍然有效:

template <typename T>
struct A
{
    template <typename U>
    void foo(U);
};

template <>
template <typename U>
void A<int>::foo(U)
{
}

但这不是:

template <typename> struct C {};

template <typename T>
struct A
{
    template <typename U>
    void foo(U);
};

template <typename T>
template <typename U>
void A<C<T> >::foo(U)
{
}

所以原因不能是函数模板只能完全专门化,因为第三个例子不是完全特化(模板参数U仍然存在),但它仍然有效。

1 个答案:

答案 0 :(得分:7)

功能模板只能完全专用,而不是部分专用。

您使用的是类模板的成员函数本身就是函数模板,因此该规则仍适用。


关于你的编辑:以下内容可以明确地(即完全)专门化,从14.7.3 / 1开始:

  

以下任何一项的明确专业化:

     

- 功能模板

     

- 班级模板

     

- 类模板的成员函数

     

- 类模板的静态数据成员

     

- 类模板的成员类

     

- 类模板的成员枚举

     

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

     

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

     

可以由template<>;

引入的声明声明

我强调了适用于您案件的两个陈述。如果没有任何其他明确规定,那些实体可以部分专业化。