LINUX.ORG.RU

Перегрузка + в template классе


0

1

template <typename T>
class A
{

}

Хочу перегрузить + так, чтобы можно было сложить A<T> + A<T>. Компилятор ругается:

DataContainer<T>& operator=(const DataContainer<T> & dc);                                  // result = this = dc
    template <typename N> friend const DataContainer<N>& operator+ (const N& value, const DataContainer<N>& dc);                // result = value + dc
    template <typename N> friend const DataContainer<N>& operator+ (DataContainer<N> * dc, T& value);                // result = dc + value
/* Здесь */ template <typename N> friend const DataContainer<N>& operator+ (DataContainer<N> * dc1, DataContainer<N> * dc2); // result = dc1 + dc2

D:\Projects\Qt\QtDataContainer\datacontainer.h:88: ошибка: 'const DataContainer<N>& operator+(DataContainer<N>*, DataContainer<N>*)' must have an argument of class or enumerated type

Как решить?



Последнее исправление: inn (всего исправлений: 2)

Нужно больше контекста. Ибо вот такой простой пример работает:

#include <iostream>
using namespace std;

template <typename T>
class Test {
public:
    Test(const T &val) : m_val(val) {}

//     Test<T> operator +(const Test<T> &other) {
//         return Test(m_val + other.m_val);
//     }

    const T& val() const { return m_val; }

    template <typename N>
    friend Test<N> operator +(const Test<N> &a, const Test<N> &b);

private:
    T m_val;
};

template <typename T>
Test<T> operator +(const Test<T> &a, const Test<T> &b) {
    return Test<T>(a.m_val + b.m_val);
}

int main() {
    Test<int> t1(2);
    Test<int> t2(2);
    Test<int> t3 = t1 + t2;

    cout << "Sum is: " << t3.val() << endl;

    return 0;
}

http://ideone.com/eTYFHk

KennyMinigun ★★★★★
()
Ответ на: комментарий от inn

Нужно было поменять указатели на ссылки.

А, тьфу, проморгал. Это же общепринятый факт: указатель является простым типом, и перегрузить операторы для него нельзя (вроди можно только вторым аргументом указатель получать).

KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

Просто у меня сработала старая привычка - гонять «большие» типы данных только по указателю, чтобы не насиловать стек.

inn
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.