Intereting Posts
Почему эта программа не получает ожидаемые пакеты UDP? Как эффективно выбирать случайный элемент из std :: set Как выбрать значение из списка с неравномерными вероятностями? segmentation fault, получающая доступ к переменной частного classа сортировка std :: lists с использованием std :: sort Как легко читать целые числа с использованием streamа C ++? Ошибка компоновщика: неопределенная ссылка на `std :: ctype :: _ M_widen_init () Можем ли мы использовать Rcpp с несколькими функциями C ++? Сложность вставки отсортированного диапазона в ассоциативный контейнер Linux: fork & execv, подождите, пока дочерний процесс зависает Указатели, переданные по ссылке, обновлены с каждой итерацией цикла: (Проверка работоспособности – Часть 2) Почему Clang оптимизирует х * 1,0, но НЕ x + 0.0? Как создать boost для android в качестве общей библиотеки с поддержкой c ++ 11 Какой из них в C ++? Почему нет необходимой квалификации?

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

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

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

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

#include  template  class PodObject { protected: T _value; public: PodObject(int rhs) { this->_value = static_cast(rhs); } PodObject operator+= (PodObject const &rhs){ this->_value = rhs._value; return *this; } }; typedef PodObject Int8; typedef PodObject 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') to 'const PodObject' for 1st argument PodObject operator+= (PodObject const &rhs){ 

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

Ниже приведен метод друга ниже для меня:

 template friend PodObject operator+= (PodObject &lhs, PodObject const &rhs) { lhs._value += rhs._value; return lhs; } 

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

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

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