2016-01-31 2 views
1

Я пытаюсь передать объект как параметр перегруженного оператора + (и класс является классом шаблона), но он дает мне ошибку, которая гласит:Передача объекта в качестве параметра перегруженного оператора + в классе шаблона

error C2955: 'Kvader': use of class template requires template argument list 

это мой класс:

template <class Q> 
class Kvader { 
private: 
    Q a, b, c; 
public: 
    Kvader(const Kvader &temp); 
    Kvader operator+(Kvader); 
}; 

и это мой перегруженный метод +:

template <class Q> 
Kvader Kvader<Q>::operator+(Kvader<int> temp) { 
a += temp.a; 
b += temp.b; 
c += temp.c; 
return *this; 
} 

Я думал, что в качестве списка аргументов будет достаточно

Kvader Kvader<Q>::operator+(Kvader<int> temp) 

. Что я делаю не так?

В моем основном я просто делаю 2 объекта (второй вызывает конструктор копирования), а затем я пытаюсь их добавить.

int main(){ 
Kvader<int> object1, object2(object1); 
object1 = object1 + object2; 

return 0; 
} 
+0

Вам нужен аргумент шаблона в типе возвращаемого значения.Как угадать, 'Kvader Kvader :: оператор + (Kvader температура) ...' –

+0

аргумент в 'оператор +' должен быть 'сопзЬ &' и его тип возвращаемого значения должна быть ссылка, как так: 'Kvader & Kvader : : operator + (const Kvader & temp) '. Addtionally вы смешиваете специализацию (для 'int') и определенных шаблонов. – Patryk

+0

@Patryk 'operator + =' должен возвращать ссылку, а не 'operator +'. –

ответ

1

Этот код содержит несколько ошибок:

1) Kvader<Q> Kvader<Q>::operator+(Kvader<int> temp)

Вам нужно указать список аргументов для типа возвращаемого значения, а также.

2) Kvader<Q> operator+(Kvader<int>);

То же, что 1) + изменить тип аргумента в Kvader<int> вместо родового Kvader<Q>.

3) Kvader<Q>(const Kvader<Q> &temp);

То же, что 1).

4) Укажите конструктор по умолчанию для Kvader<Q>, иначе заявление о создании в main() будет терпеть неудачу.

5) Кроме того, operator+(const T&) должен возвращать ссылку, позволяющую привязывать оператора. Он также обычно использует константную ссылку, чтобы избежать ненужного копирования.

6) Наконец, если у вас нет особых причин делать это так, как вы это делали, вещи, такие как operator+(const Kvader<Q>&), должны сначала определяться общим образом, а затем быть специализированными, когда это необходимо сделать , Способ, которым вы его написали, operator+(cont Kvader<int>&) работает только для тех типов, где Q тип объекта this может быть добавлен в int. То, что вы, вероятно, хотели достичь, состояло в том, чтобы включить специализацию Kvader с любым определенным параметром, который будет добавлен к Kvader с тем же точным параметром. Затем вы можете создавать специализации для конкретных типов Q, например int.

Предлагаю вам ознакомиться с шаблонами классов и функций! На самом деле они могут ввести в заблуждение.

Полный код:

template <class Q> 
class Kvader { 
private: 
    Q a, b, c; 
public: 
    Kvader() {} 
    Kvader(const Kvader<Q> &temp); 
    Kvader& operator+(const Kvader<Q>& temp); 
}; 

template <class Q> 
Kvader<Q>& Kvader<Q>::operator+(const Kvader<Q>& temp) { 
a += temp.a; 
b += temp.b; 
c += temp.c; 
return *this; 
} 

template<class Q> 
Kvader<Q>::Kvader(const Kvader<Q> &temp) 
{} 

int main(){ 
Kvader<int> object1, object2(object1); 
object1 = object1 + object2; 

return 0; 
} 
+0

Спасибо вам большое! – Clg

+0

'' не требуется внутри 'class Kvader {...};', это неявно. –

+0

Я не эксперт, но не cpp.sh, который использует gcc 4.9 в качестве бэкэнд, принимает этот код. Спасибо за подсказку! Я проверю книгу Йосуттиса. – iksemyonov

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