以下代码:
templatestruct foo { void bar(); }; template void foo ::bar() { }
给了我错误
invalid use of incomplete type 'struct foo' declaration of 'struct foo '
(我正在使用gcc.)我的部分特化的语法错了吗?请注意,如果我删除第二个参数:
templatestruct foo { void bar(); }; template <> void foo ::bar() { }
然后它正确编译.
你不能部分专门化一个功能.如果您希望在成员函数上执行此操作,则必须部分专门化整个模板(是的,这很烦人).在一个大的模板类上,要部分专门化一个函数,你需要一个解决方法.也许模板化的成员结构(例如template
)可以工作.否则,您可以尝试从另一个部分特化的模板派生(如果您使用this->member
表示法,则工作,否则您将遇到编译器错误).
虽然coppro已经提到了两个解决方案,而Anonymous解释了第二个解决方案,但我花了很长时间来理解第一个解决方案.也许以下代码对于在这个网站上磕磕绊绊的人有帮助,这个网站在谷歌中仍然排名很高,就像我一样.示例(将numericT的vector/array/single元素作为dataT传递,然后通过[]或直接访问它)当然有点人为,但应该说明你如何通过包装它实际上非常接近部分特化成员函数在一个部分专业的课堂上.
/* The following circumvents the impossible partial specialization of a member function actualClass::access as well as the non-nonsensical full specialisation of the possibly very big actualClass. */ //helper: template class specialised{ public: numericalT& access(dataT& x, const unsigned int index){return x[index];} }; //partial specialisation: template class specialised { public: numericalT& access(dataT& x, const unsigned int index){return x;} }; //your actual class: template class actualClass{ private: dataT x; specialised accessor; public: //... for(int i=0;i