给定下面的代码,编译器显示一条消息指出该错误:模板可能不是“虚拟”.有谁有一个建议如何解决这个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&).