加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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&).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读