Я изо всех сил пытаюсь понять, почему в следующем коде вызывается предположительно неправильная перегрузка.
// 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 doFoochar ", но вместо этого я получил" T1 doFoo generic ".
Если я переместу T2 :: doFoo (char c) в T1, все будет работать как положено.В чем причина такого поведения?любой обходной путь?