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:我重新措辞了这句话(并添加了一点隐藏名称的理由)。酷,在寻找模板方法是否可以覆盖其他模板方法时发现了这一点-看起来它们可以,这是明智的!