微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/c/110907.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐