当前位置:  开发笔记 > 编程语言 > 正文

部分模板特化的"无效使用不完整类型"错误

如何解决《部分模板特化的"无效使用不完整类型"错误》经验,为你挑选了2个好方法。

以下代码:

template 
struct foo {
   void bar();
};

template 
void foo ::bar() {
}

给了我错误

invalid use of incomplete type 'struct foo'
declaration of 'struct foo'

(我正在使用gcc.)我的部分特化的语法错了吗?请注意,如果我删除第二个参数:

template 
struct foo {
   void bar();
};

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

然后它正确编译.



1> coppro..:

你不能部分专门化一个功能.如果您希望在成员函数上执行此操作,则必须部分专门化整个模板(是的,这很烦人).在一个大的模板类上,要部分专门化一个函数,你需要一个解决方法.也许模板化的成员结构(例如template struct Nested)可以工作.否则,您可以尝试从另一个部分特化的模板派生(如果您使用this->member表示法,则工作,否则您将遇到编译器错误).



2> 小智..:

虽然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

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有