子类调用意外的重载函数
Child class calling unexpected overloaded function
我正在努力理解为什么在下面的代码中调用了所谓的错误重载。
// overload.h
struct T1
{
template<class... Args>
void doFoo(Args&&... args)
{
std::cout << "T1 doFoo generic"<< std::endl;
}
void doFoo(int a)
{
std::cout << "T1 doFoo INT "<< std::endl;
}
void doFoo(double a)
{
std::cout << "T1 doFoo Double "<< std::endl;
}
template<class... Args>
void foo(Args&&... args)
{
doFoo(args...);
}
};
struct T2 : public T1
{
void doFoo(char c)
{
std::cout << "T2 doFoo char " << std::endl;
}
};
// main.cpp
#include <overload.h>
int main()
{
T2 t2;
t2.foo(3);
t2.foo('A'); // This outputs: T1 doFoo generic
}
我期待t2.foo('A')作为输出:"T2 doFoo char",但相反,我得到了"T1 doFoo泛型"。
如果我将 T2::d oFoo(char c( 移动到 T1 中,一切都按预期工作。这种行为的原因是什么?有什么解决方法吗?
正如注释中已经建议的那样,由于T1
不知道派生的结构T2
,T1::foo
也找不到T2::doFoo(char c)
并且无法实现此静态绑定。
T2
中为char
虚假重载T1::foo
的简单解决方法是再次在T2
中声明foo
并重载它,如下所示:
演示
struct T1
{
template<class... Args>
void doFoo(Args&&... args){
std::cout << "T1 doFoo generic"<< std::endl;
}
void doFoo(int a){
std::cout << "T1 doFoo INT "<< std::endl;
}
void doFoo(double a){
std::cout << "T1 doFoo Double "<< std::endl;
}
template<class... Args>
void foo(Args&&... args){
doFoo(std::forward<Args>(args)...);
}
};
struct T2 : public T1
{
template<class... Args>
void foo(Args&&... args){
T1::foo(std::forward<Args>(args)...);
}
void foo(char c){
std::cout << "T2 foo char " << std::endl;
}
};
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 可以打印矢量和矢量中的矢量的非重载C++函数
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 使用模板重载函数
- C++线程中,没有重载函数接受 X 参数
- std::vector 没有重载函数的实例与参数列表匹配
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 对重载函数find_first_not_of的不明确调用
- 如何从重载解析中删除重载函数?
- CUDA:重载函数"isnan"的多个实例
- C++派生类重载函数(带有 std::function 参数)不可见
- 避免在人为的重载函数调用中拼写出类型
- C++:如何为多个重载函数保留通用代码路径?
- 什么时候可以使用常量装饰调用我的重载函数?
- 尝试使用谓词函数会导致错误:"std::sort"未找到匹配的重载函数
- std::调用,未找到匹配的重载函数
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 为什么使用不匹配的参数调用重载函数仍然有效
- 如何通过签名作为模板参数来解决重载函数?