Перегрузка оператора шаблона C ++ разными типами

В приведенном ниже примере определяется базовый класс контейнера подтипа. Используя этот класс, создается серия typedef, которые представляют собой версию ООП базового подтипа. Проблема возникает, когда мы начинаем присваивать эти типы друг другу.

Я попытался определить оператор как метод друга с аргументами lhs и rhs, используя простой PodObjects как тип, но без каких-либо успехов. Есть ли кто-нибудь, кто мог испытать что-то похожее или знает другое решение этой проблемы.

Заранее спасибо.

<code>#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;
}
</code>

Результаты в выводе компилятора:

<code>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){
</code>

РЕДАКТИРОВАТЬ:

Метод друга ниже делает эту работу за меня:

<code>template<typename U, typename W>
friend PodObject<U> operator+= (PodObject<U> &lhs, PodObject<W> const &rhs) {
    lhs._value += rhs._value;
    return lhs;
} 
</code>

Ответы на вопрос(1)

Решение Вопроса

operator + потому что вы пытаетесь добавитьdifferent типы:

template <typename U>
PodObject<T> operator+= (PodObject<U> const &rhs){
    this->_value = rhs._value;
    return *this;
}

Тем не менее, весь код выглядит как анти-шаблон. Ваша & # x201C; ООП-версия основного подтипа & # x201D; не является значимым или вообще полезным понятием.

 14 апр. 2012 г., 14:20
+1 за "не имеет смысла, не полезно".
 14 апр. 2012 г., 14:26
Переменная-член не должна бытьpublic если вы сделаетеPodObjectДрузья друг друга:template<class T> friend PodObject<T>; Постскриптум Вы попадете в ад программистов, только если вы действительно доставите этот код.
 Roy14 апр. 2012 г., 14:23
Это был скорее эксперимент, а не что-то вменяемое, и да, я пойду к черту программистов за это :). Но спасибо за ответ, переменная-член должна быть публичной, чтобы это работало.

Ваш ответ на вопрос