Он действительно делает правильные вещи. Вот причина.
namespace A {
struct Mine {};
template <typename T1, typename T2>
void foo(T1, T2)
{
std::cout << "A::foo" << std::endl;
}
}
Приведенный выше код будет сопоставлен, если будет передано 2 параметра разного (или одного и того же) типа. Потому что вы определили и T1
, и T2
по-разному (но они также могут быть одинаковыми). Но вызов функции
foo(a, a);
имеет оба параметра одного типа. Теперь метод foo
с двумя параметрами одного типа определен в namespace B
, как показано ниже
namespace B {
template <typename T>
void foo(T, T)
{
std::cout << "B::foo" << std::endl;
}
}
И, таким образом, метод из namespace B
совпадает, поскольку обе подписи различны.
Попробуйте добавить приведенный ниже код
namespace C {
template <typename T>
void foo(T, T)
{
std::cout << "B::foo" << std::endl;
}
}
, и вы получите ошибку компилятора, указав двусмысленность в определении метода, а затем вам придется вручную разрешить область foo, используя что-то например, A::foo(a,a)
или любое другое пространство имен, которое вы используете sh.