C++ 从模板化基类重写方法时出现的问题

C++ 从模板化基类重写方法时出现的问题,c++,C++,在从基模板类派生的类中,我重写了方法createType()。当我试图访问派生类的createType(int)时,编译器说它不存在。为什么? template <class T> class BaseClass { public: virtual T createType(){ return T(); } virtual T createType(int){ return T(); } }; class Point { public: float x, y

在从基模板类派生的类中,我重写了方法
createType()
。当我试图访问派生类的
createType(int)
时,编译器说它不存在。为什么?

template <class T>
class BaseClass
{
public:
    virtual T createType(){ return T(); }
    virtual T createType(int){ return T(); }
};

class Point
{
public:
    float x, y;
};

class PointFactory : public BaseClass<Point>
{
public:
    virtual Point createType() { return BaseClass::createType(); }
};

int main()
{
    PointFactory pf;
    auto p = pf.createType(5); // error here
    return 0;
}
模板
类基类
{
公众:
虚拟T createType(){返回T();}
虚拟T createType(int){return T();}
};
类点
{
公众:
浮动x,y;
};
类PointFactory:公共基类
{
公众:
虚拟点createType(){返回基类::createType();}
};
int main()
{
点工厂pf;
auto p=pf.createType(5);//此处出错
返回0;
}
我得到的错误是

错误C2660:“PointFactory::createType”:函数不接受1个参数


虚拟点工厂::createType()
隐藏基本重载

您可以使用BaseClass::createType添加
要解决此问题,请执行以下操作:

class PointFactory : public BaseClass<Point>
{
public:
    using BaseClass<Point>::createType; // unhide overloads

    Point createType() override { return BaseClass::createType(); }
};
class PointFactory:公共基类
{
公众:
使用基类::createType;//取消隐藏重载
点createType()重写{返回基类::createType();}
};

虚拟点工厂::createType()
隐藏基本重载

您可以使用BaseClass::createType添加
要解决此问题,请执行以下操作:

class PointFactory : public BaseClass<Point>
{
public:
    using BaseClass<Point>::createType; // unhide overloads

    Point createType() override { return BaseClass::createType(); }
};
class PointFactory:公共基类
{
公众:
使用基类::createType;//取消隐藏重载
点createType()重写{返回基类::createType();}
};

除了覆盖之外,还有两个问题:

  • 您使用参数调用子类函数,但子类没有使用该名称的成员函数使用整数参数

  • 返回T?如果
    T
    是例如
    int
    ,那么这将是
    返回int,您希望它如何工作?这将导致基类中的函数不存在,并且在
    重写该函数后,可能会出现类似于您所询问的错误


  • 除了覆盖之外,还有两个问题:

  • 您使用参数调用子类函数,但子类没有使用该名称的成员函数使用整数参数

  • 返回T?如果
    T
    是例如
    int
    ,那么这将是
    返回int,您希望它如何工作?这将导致基类中的函数不存在,并且在
    重写该函数后,可能会出现类似于您所询问的错误


  • 检查g++报告的错误可能更清楚:

    因为您重写了
    createType()
    ,所以
    createType(int)
    被隐藏。除非在派生类中重新实现它(可能使用
    using
    ),否则无法访问它:

    class PointFactory : public BaseClass<Point>
    {
    public:
        virtual Point createType() { return Point(0,0); }
        using BaseClass<Point>::createType;
    };
    
    class PointFactory:公共基类
    {
    公众:
    虚拟点createType(){返回点(0,0);}
    使用BaseClass::createType;
    };
    

    我已经让重写的
    createType()
    做了一些事情,而不是传递给基类,否则它在这里是多余的

    检查g++报告的错误可能更清楚:

    因为您重写了
    createType()
    ,所以
    createType(int)
    被隐藏。除非在派生类中重新实现它(可能使用
    using
    ),否则无法访问它:

    class PointFactory : public BaseClass<Point>
    {
    public:
        virtual Point createType() { return Point(0,0); }
        using BaseClass<Point>::createType;
    };
    
    class PointFactory:公共基类
    {
    公众:
    虚拟点createType(){返回点(0,0);}
    使用BaseClass::createType;
    };
    

    我已经让重写的
    createType()
    做了一些事情,而不是传递给基类,否则它在这里是多余的

    实际的错误消息是什么?请编辑您的问题,以包含完整的错误消息,完整的、未编辑的,以及任何可能的信息注释。如果覆盖,您应该使用
    override
    。我只是写下这个示例,以便能够清楚地揭示问题,实际的实现是一个非常大的代码,只使用类。实际的错误消息是什么?请编辑您的问题,以包含完整的错误消息,完整的,未编辑的,以及任何可能的信息注释。如果您重写,您应该使用
    override
    。我写下这个示例只是为了能够清楚地揭示问题,实际实现是一个非常大的代码,只使用了类(比我快了8秒!)我将删除我的答案。请您描述一下如何在类声明内部和外部声明它,谢谢完美,谢谢。当我能找到关于这个问题的更多信息时,你有链接吗?比我快了8秒!:)我将删除我的答案。请您描述一下如何在类声明内部和外部声明它,谢谢完美,谢谢。当我能找到关于这个问题的更多信息时,你有没有链接?我只是写下这个例子,以便能够清楚地揭示问题,实际的实现是一个非常大的代码,只需要classes@fatehmtd不相关的错误会分散对实际问题的注意力,特别是因为我描述的两个问题可能会给您类似于覆盖错误的错误消息。这就是为什么创建一个非常重要的问题,在生成错误的情况下,创建一个只包含您所询问的错误的错误。我只是写下这个示例,以便能够清楚地揭示问题,实际的实现是一个非常大的代码,只需使用classes@fatehmtd不相关的错误会分散对实际问题的注意力,特别是因为我描述的两个问题可能会给您类似于覆盖错误的错误消息。这就是为什么创建一个错误非常重要的原因,在生成错误的情况下,创建一个只包含您询问的错误的错误。