Хотя типы взяты из одного и того же шаблона, они абсолютно не связаны. Вы не можете просто приводить между ними, как компилятор может знать, что вы подразумеваете под приведением? Из-за специализации шаблонов pClass<char>
может даже не содержать char
, который может быть приведен к int
.
Решение состоит в том, чтобы написать значение приведения , используя cast оператор преобразования:
template <typename T>
class pClass {
public:
T value;
pClass(T value) {
this->value = value;
std::cout << value << std::endl;
}
virtual ~pClass() {}
template<typename U>
operator pClass<U>(){
return pClass<U>(static_cast<U>(this->value));
}
};
Приведенный выше метод позволяет приводить между любыми двумя значениями pClass<T>
и pClass<U>
путем приведения сохраненного значения. Это сделает следующий код скомпилированным:
pClass<int> pInt{1};
pClass<float> pfloat{pInt};
Где вторая строка - конструктор копирования pClass<float>::pClass<float>(const pClass<float>&);
, который использует неявное приведение для преобразования pInt
в pClass<float>
тип.
Я бы рекомендовал сделать оператор преобразования явным:
template<typename U> explicit operator pClass<U>()
Это запрещает неявное преобразование, описанное выше, но все же допускает явное приведение:
pClass<float> pfloat{static_cast<pClass<float>>(pInt)};