У меня есть шаблон класса, который создается в довольно большом количестве типов (~ 25). Некоторые из них могут правильно преобразовать друг друга, и я хотел бы, чтобы это произошло неявно. Я думаю, что это означает, что я должен сделать оператор конверсии в шаблон класса, но условно включает его с помощью Sfinae, где условие в том, что я вручную написал функцию преобразования, принимая правильные типы, где это имеет смысл. Вот чрезвычайно упрощенный пример, который иллюстрирует проблему: < /p>
Код: Выделить всё
#include
template
class Template;
class SourceType {};
class TargetType {};
// forward-declare the convert() so that the declval() can look at it
const Template & convert(const Template &);
template
class Template
{
public:
template
explicit operator const U& () const { return convert(*this); }
};
// need the Template class template to be defined
// before this function is defined because we'll need to use its members
const Template & convert(const Template &)
{
// obviously not a real implementation
return *new Template();
}
int main()
{
Template src;
// try to explicitly call the conversion operator to test it
src.operator const Template&();
return 0;
}
< /code>
Это не компилируется. GCC 13 (как всегда) дает мне запутанную ошибку, неверная инициализация ссылки типа «шаблон const» & 'из выражения типа «шаблон const ' Я думаю, что я как -то непреднамеренно создал цикл, где оба Convert ()
Подробнее здесь: https://stackoverflow.com/questions/794 ... ith-sfinae
Мобильная версия