C++ 基类模板成员函数隐藏在派生类中,尽管参数列表不同

C++ 基类模板成员函数隐藏在派生类中,尽管参数列表不同,c++,templates,inheritance,C++,Templates,Inheritance,这让我感到疑惑。假设我有: class Base { public: template<typename T> void foo(T& varT) { // } template<typename T, typename U> void foo(T& varT, U& varU) { // } }; class Child : public Bas

这让我感到疑惑。假设我有:

class Base
{
public:

    template<typename T>
    void foo(T& varT)
    {
        //
    }

    template<typename T, typename U>
    void foo(T& varT, U& varU)
    {
        //
    }
};

class Child : public Base
{
public:
    template<typename T, typename U, typename Z>
    void foo(T& varT, U& varU, Z& varZ)
    {
        //
    }
};
类基
{
公众:
模板
void foo(T&varT)
{
//
}
模板
void foo(T&varT,U&varU)
{
//
}
};
类子:公共基
{
公众:
模板
void foo(T&varT,U&varU,Z&varZ)
{
//
}
};
现在,当我尝试这个:

Child c;

char cVar;
int iVar;
float fVar;

c.foo(cVar);
c.foo<int>(cVar);
c.template foo<int>(cVar);
子c;
炭cVar;
int iVar;
浮动fVar;
c、 foo(cVar);
c、 foo(cVar);
c、 模板foo(cVar);
这些电话都没用。它们总是被错误“调用时没有匹配的成员函数”所掩盖。有人能告诉我解决这个问题的方法吗?我在标准中读到,派生对象阴影模板函数继承了,但标准明确指出,如果对其进行阴影处理,则参数列表必须相同


感谢您的帮助。

当您在基类中存在的派生类中有名称时,总是会隐藏基类成员。基本原因是,需要保护派生类的使用不受基类更改的影响:假设基类中的名称没有隐藏,如果在基类中添加了新的重载,则可能会劫持对派生成员的工作查找,而不是引用基类,而不会在派生类中指示基类中可能发生的事情。如果要使基本成员可用,可以使用
使用
声明:

class Child : public Base
{
public:
     using Base::foo; // declare that you want look up members from the base class

     template<typename T, typename U, typename Z>
     void foo(T& varT, U& varU, Z& varZ)
     {
         //
     }
};

当基类中存在派生类中的名称时,总是会隐藏基类成员。基本原因是,需要保护派生类的使用不受基类更改的影响:假设基类中的名称没有隐藏,如果在基类中添加了新的重载,则可能会劫持对派生成员的工作查找,而不是引用基类,而不会在派生类中指示基类中可能发生的事情。如果要使基本成员可用,可以使用
使用
声明:

class Child : public Base
{
public:
     using Base::foo; // declare that you want look up members from the base class

     template<typename T, typename U, typename Z>
     void foo(T& varT, U& varU, Z& varZ)
     {
         //
     }
};
你需要这个:

添加到孩子的定义中:

using Base::foo;
你需要这个:

添加到孩子的定义中:

using Base::foo;

但该标准明确规定,如果参数列表被“错误”隐藏,则参数列表必须相同。这是重写虚拟函数所必需的。”但标准明确规定,如果参数列表被阴影覆盖,则参数列表必须相同“错误”。这是重写虚拟函数所必需的。酷!谢谢你的澄清。工作起来很有魅力。我会尽快接受这个答案:)@dyp:我重新措辞了这句话(并添加了一点隐藏名称的理由)。酷,在寻找模板方法是否可以覆盖其他模板方法时发现了这一点-看起来它们可以,这是明智的!酷!谢谢你的澄清。工作起来很有魅力。我会尽快接受这个答案:)@dyp:我重新措辞了这句话(并添加了一点隐藏名称的理由)。酷,在寻找模板方法是否可以覆盖其他模板方法时发现了这一点-看起来它们可以,这是明智的!