模板类成员函数为虚函数,被普通类继承覆盖该虚函数反而导致编译失败

问题描述

c++的模板类里写了一个虚函数,在编译时虽然没有调用却被编译导致整体编译失败

相关代码

#include <iostream>
#include <set>
using namespace std;

template<typename T>
class Base
{
public:
    virtual void insert(int e){c.push_back(e);}
protected:
    T c;
};

class Derived:public Base<std::set<int>>
{
public:
    virtual void insert(int e){c.insert(e);}
};

int main()
{
    Derived d;
    d.insert(3);
    return 0;
}

我用一个普通类继承该模板类,然后覆盖掉原本的虚函数。但是在实际编译的过程中由于模板实例化导致基类的虚函数被编译,继而这个模板的基类无法通过编译。理论上这里基类原本的虚函数是不会被调用的,却因为模板初始化的问题导致编译失败,所以请教下这里该怎么解决?

阅读 4.3k
3 个回答

把基类的虚函数改成纯虚,不要定义。

理论上这里基类原本的虚函数是不会被调用的

如果你不期望它被使用,就不要实现了。

首先set的插入函数insert,没有push_back;

push_back改为insert后,我这里编译没问题;

另外你可以在函数声明后跟,overrider关键词来显式覆盖;

限定下条件,假设push_back函数只在vector中出现

template<typename T>
class Base
{
public:
    virtual void insert(int e) {
        if constexpr (std::is_same<T, std::vector<int>>::value) {
            c.push_back(e);
        }
    }
protected:
    T c;
};
推荐问题