Я пытаюсь скомпилировать некоторый код в VS2019 с / permissive - который включает в себя как шаблоны, так и перегрузки, и происходят странные вещи.(https://godbolt.org/z/fBbQu6)
Как и в Godbolt, когда мой templateFunc () объявляется между двумя перегрузками, например так:
namespace Foospace {
class A;
void func(A*) {};
template<class T> void templateFunc() { Foospace::func((T*)0); }
class B;
void func(B*) {};
void func() { Foospace::templateFunc<B>(); }
}
Я получаю error C2664: 'void Foospace::func(Foospace::A *)': cannot convert argument 1 from 'T *' to 'Foospace::A *'
Если япереместите templateFunc () ниже перегрузок, это, очевидно, работает:
namespace Foospace {
class A;
void func(A*) {};
class B;
void func(B*) {};
template<class T> void templateFunc() { Foospace::func((T*)0); }
void func() { Foospace::templateFunc<B>(); }
}
И если я переместлю templateFunc () до обеих перегрузок, это также работает:
namespace Foospace {
template<class T> void templateFunc() { Foospace::func((T*)0); }
class A;
void func(A*) {};
class B;
void func(B*) {};
void func() { Foospace::templateFunc<B>(); }
}
И если я сохраню templateFunc() между двумя перегрузками, но просто удалите спецификатор Foospace
namespace из вызова func (), и вдруг это тоже сработает:
namespace Foospace {
class A;
void func(A*) {};
template<class T> void templateFunc() { func((T*)0); }
class B;
void func(B*) {};
void func() { Foospace::templateFunc<B>(); }
}
Что здесь происходит?