部分模板专门化导致"无效使用不完整类型"错误

时间:2020-03-06 15:03:22  来源:igfitidea点击:

如下代码:

template <typename S, typename T>
struct foo {
   void bar();
};

template <typename T>
void foo <int, T>::bar() {
}

给我错误

invalid use of incomplete type 'struct foo<int, T>'
declaration of 'struct foo<int, T>'

(我正在使用gcc。)我的部分专业化语法是否错误?请注意,如果我删除第二个参数:

template <typename S>
struct foo {
   void bar();
};

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

然后它可以正确编译。

解决方案

我们不能部分专门化一个功能。如果希望对成员函数执行此操作,则必须对整个模板进行部分专业化处理(是的,这很烦人)。在大型模板类上,要部分专用于某个功能,我们需要一种解决方法。模板成员结构(例如template &lt;typename U = T>嵌套结构)可能会起作用。否则,我们可以尝试从部分专业化的另一个模板中派生(如果我们使用this-> member`表示法,则可以使用,否则会遇到编译器错误)。