В приведенном ниже примере определяется базовый класс контейнера подтипа. Используя этот класс, создается серия typedefs, которые представляют собой версию OOP базового подтипа. Проблема возникает, когда мы начинаем назначать эти типы друг другу.Перегрузка операторов шаблонов C++ различными типами
Я попытался определить оператор как метод friend с аргументами lhs и rhs, используя простые типы PodObjects, но без каких-либо успехов. Есть ли кто-нибудь, кто мог бы испытать что-то симулятивное или знал другое решение этой проблемы.
Заранее спасибо.
#include <stdint.h>
template <typename T>
class PodObject {
protected:
T _value;
public:
PodObject<T>(int rhs) {
this->_value = static_cast<T>(rhs);
}
PodObject<T> operator+= (PodObject<T> const &rhs){
this->_value = rhs._value;
return *this;
}
};
typedef PodObject<int8_t> Int8;
typedef PodObject<int16_t> Int16;
int main() {
Int16 a = 10;
Int8 b = 15;
a += b; // Source of problem
return 0;
}
Результаты в выходе компилятора:
example.cpp:26:11: error: no viable overloaded '+='
a += b;
~^~
example.cpp:13:22: note: candidate function not viable: no known conversion from 'Int8' (aka 'PodObject<int8_t>') to 'const PodObject<short>'
for 1st argument
PodObject<T> operator+= (PodObject<T> const &rhs){
EDIT:
Метод друг ниже делает работу для меня:
template<typename U, typename W>
friend PodObject<U> operator+= (PodObject<U> &lhs, PodObject<W> const &rhs) {
lhs._value += rhs._value;
return lhs;
}
+1 для «не значимого, не полезно». –
Это был скорее эксперимент, а не что-то здравомыслящий, и да, я пойду к программистам ад для этого :). Но, спасибо за ответ, переменная-член, однако, должна быть общедоступной, чтобы это работало. – Roy
Элемент-член не обязательно должен быть 'public', если вы создаете' друзей PodObject друг друга: 'template friend PodObject ;' P.S. Если вы действительно доставляете этот код, вы идете только к программисту. –