У меня есть два шаблона класса TemplateA<T>
а также TemplateB<T>
, Теперь я хочу определить оператор преобразования в TemplateB<T>
чтобы неявные преобразования типов из TemplateB<T>
в TemplateA<T>
, Однако следующий код вызывает ошибку компиляции:
struct ClassA {};
template<typename T>
struct TemplateA {
T val;
};
template<typename T>
struct TemplateB {
T val;
template<typename ValT>
operator TemplateA() const {
TemplateA<ValT> a;
a.val = val;
return a;
}
};
int main() {
TemplateB<ClassA> b;
TemplateA<ClassA> a = b;
return 0;
}
Ошибка:
main.cpp:13:12: error: expected type-specifier before 'TemplateA'
operator TemplateA() const {
^
Я хочу определить оператор преобразования в
TemplateB<T>
разрешить неявные преобразования типов изTemplateB<T>
вTemplateA<T>
Это не требует шаблона функции преобразования. Простая функция преобразования сделает:
operator TemplateA<T>() const {
TemplateA<T> a;
a.val = val;
return a;
}
Вам нужен шаблон, только если вы хотите разрешить конвертацию из TemplateB<Foo>
в TemplateA<Bar>
,
В дополнение к Ответ Т.С., вы также можете определить преобразование другим способом, если захотите — вместо добавления функции преобразования [не шаблон] в TemplateB
Вы можете добавить [не шаблон] конвертирующий конструктор в TemplateA
:
template<typename T>
struct TemplateB {
T val;
};
template<typename T>
struct TemplateA {
T val;
TemplateA() = default;
// converting constructor
TemplateA(TemplateB<T> const& t)
: val(t.val)
{ }
};
Параметр шаблона является частью определения типа, поэтому его нельзя опустить в операторе преобразования:
template<typename ValT>
operator TemplateA<ValT>() const {
TemplateA<ValT> a;
a.val = val;
return a;
}
Это помогает думать, что компилятор будет добавлять шаблонный тип к вычисляемому типу шаблона. Таким образом, ваш код будет генерировать что-то вроде operator TemplateA_ClassA() const
который будет использоваться для конвертации TemplateB_ClassA
в TemplateA_ClassA
,