Операторы преобразования в шаблонах классов

У меня есть два шаблона класса 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 {
^

1

Решение

Я хочу определить оператор преобразования в TemplateB<T> разрешить неявные преобразования типов из TemplateB<T> в TemplateA<T>

Это не требует шаблона функции преобразования. Простая функция преобразования сделает:

operator TemplateA<T>() const {
TemplateA<T> a;
a.val = val;
return a;
}

Вам нужен шаблон, только если вы хотите разрешить конвертацию из TemplateB<Foo> в TemplateA<Bar>,

2

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

В дополнение к Ответ Т.С., вы также можете определить преобразование другим способом, если захотите — вместо добавления функции преобразования [не шаблон] в 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)
{ }
};
1

Параметр шаблона является частью определения типа, поэтому его нельзя опустить в операторе преобразования:

template<typename ValT>
operator TemplateA<ValT>() const {
TemplateA<ValT> a;
a.val = val;
return a;
}

Это помогает думать, что компилятор будет добавлять шаблонный тип к вычисляемому типу шаблона. Таким образом, ваш код будет генерировать что-то вроде operator TemplateA_ClassA() const который будет использоваться для конвертации TemplateB_ClassA в TemplateA_ClassA,

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