c – 模板可能不是“虚拟”
发布时间:2020-12-16 03:36:18 所属栏目:百科 来源:网络整理
导读:给定下面的代码,编译器显示一条消息指出该错误:模板可能不是“虚拟”.有谁有一个建议如何解决这个bug? template class FOO_TYPEclass CFoo{ public: ... template class BAR_TYPE virtual void doSomething( const CBarBAR_TYPE ); // here's the error ..
给定下面的代码,编译器显示一条消息指出该错误:模板可能不是“虚拟”.有谁有一个建议如何解决这个bug?
template < class FOO_TYPE> class CFoo{ public: ... template < class BAR_TYPE > virtual void doSomething( const CBar<BAR_TYPE> &); // here's the error ... virtual ~CFoo(); protected: MyClass < FOO_TYPE > * m_pClass; }; template < class FOO_TYPE > template < class BAR_TYPE > void CFoo<FOO_TYPE>::doSomething( const CBar<BAR_TYPE> & refBar ){ ... } 解决方法
看到为什么这是非法的最简单的理由是考虑vtable.当然,这只是一个常见的实现,其他的是允许的.但是C中的所有虚拟函数都被设计成可以使用vtable来实现.
现在,CFoo< int>的vtable中有多少条目?是否有doSomething< float>的条目?和doSomething< float *>?和doSomething< float **> ?诸如这些模板允许生成无限集的函数.通常这是没有问题的,因为你只使用一个有限的子集,但对于虚拟函数,这个子集是不知道的,因此vtable将需要是无限的. 现在,您真的只想在vtable中只有一个条目.在这种情况下,你会写下如下: template < class FOO_TYPE,class BAR_TYPE> class CFoo{ public: ... virtual void doSomething( const CBar<BAR_TYPE> &); // now OK. ... virtual ~CFoo(); protected: MyClass < FOO_TYPE > * m_pClass; }; 这意味着CFoo的< int&float>将有一个条目,用于doSomething(float const&). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |