c – 模板可能不是“虚拟”

前端之家收集整理的这篇文章主要介绍了c – 模板可能不是“虚拟”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
给定下面的代码,编译器显示一条消息指出该错误:模板可能不是“虚拟”.有谁有一个建议如何解决这个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&).

猜你在找的C&C++相关文章