Оператор преобразования с аргументом шаблона по умолчанию

Мне было интересно, что не так с следующий код:

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();
}

Полный код:

https://ideone.com/yWVtgR

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;
}

https://ideone.com/XcRkTn

class Test
{
public:
template<typename T>
operator T()
{
return T();
}
};
class Test1{};

int main() {
Test t;
Test1 t1 = (Test1)t;

return 0;
}

0

Решение

Вы делаете это слишком сложно для компилятора с этим

template<typename T, typename U = T>
operator U()
{
return U();
}

Код говорит: «U того же типа, что и T». И компилятор спрашивает «А что такое T?». T не используется нигде в вашем коде, поэтому компилятор не может вывести его.

typename U = T работает только в одну сторону, чтобы определить U когда T известен.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector