2012-04-14 4 views
1

В приведенном ниже примере определяется базовый класс контейнера подтипа. Используя этот класс, создается серия 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; 
} 

ответ

4

Вам нужен шаблонный operator +, потому что вы пытаясь добавить различных типов:

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

Тем не менее, весь код выглядит как анти-паттерн. Ваша «ООП-версия базового подтипа» не является осмысленной или вообще полезной концепцией.

+1

+1 для «не значимого, не полезно». –

+0

Это был скорее эксперимент, а не что-то здравомыслящий, и да, я пойду к программистам ад для этого :). Но, спасибо за ответ, переменная-член, однако, должна быть общедоступной, чтобы это работало. – Roy

+0

Элемент-член не обязательно должен быть 'public', если вы создаете' друзей PodObject друг друга: 'template friend PodObject ;' P.S. Если вы действительно доставляете этот код, вы идете только к программисту. –

Смежные вопросы