我将尝试使用/permissive-在VS2019中编译一些涉及模板和重载的代码,但出现了一些奇怪的问题。 (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>(); }
}
我遇到了错误 C2664: 'void Foospace::func(Foospace::A *)': 无法将参数1从'T *'转换为'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()在这两个重载函数之间,但是将对func()的调用中的Foospace命名空间限定符删除,那么突然间它也可以工作:
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>(); }
}
这里正在发生什么?