Мне было интересно, что не так с следующий код:
template<typename T, typename U = T>
operator U()
{
return U();
}
Это не с error: no matching function for call to 'Test1::Test1(Test&)'
тогда как преобразование на следующий код преуспевает:
template<typename T>
operator T()
{
return T();
}
Полный код:
class Test
{
public:
template<typename T, typename U = T>
operator U()
{
return U();
}
};
class Test1{};
int main() {
Test t;
Test1 t1 = (Test1)t;
return 0;
}
class Test
{
public:
template<typename T>
operator T()
{
return T();
}
};
class Test1{};
int main() {
Test t;
Test1 t1 = (Test1)t;
return 0;
}
Вы делаете это слишком сложно для компилятора с этим
template<typename T, typename U = T>
operator U()
{
return U();
}
Код говорит: «U того же типа, что и T». И компилятор спрашивает «А что такое T?». T
не используется нигде в вашем коде, поэтому компилятор не может вывести его.
typename U = T
работает только в одну сторону, чтобы определить U
когда T
известен.
Других решений пока нет …