Как мне заставить следующий код работать должным образом?
Версия без шаблона компилируется отлично, но версия шаблона с треском проваливается. Почему версия шаблона не может определить, какую версию функции вызывать и как это исправить? Я думал о добавлении в шаблон AT оператора класса, который неявно преобразуется в BT, но он тоже не работает.
class A {};
class B
{
public:
B(A){};
};
void func(B){};
template<typename T>
class AT {};
template<typename T>
class BT
{
public:
BT(AT<T>){};
};
template<typename T>
void funcT(BT<T>){};
int main()
{
func(A{});
funcT(AT<int>{}); // unable to deduce the funcT template argument
funcT<int>(AT<int>{}); // compiles but I don't want to write that
return 0;
}
Есть немые исправления, такие как написание версии функции, которая принимает AT<T>
и приводит к * 1007. *. Но я не хочу писать кучу функций, когда все должно работать как есть. Я мог бы понять это, если бы это был неоднозначный вызов ...