Ошибка при использовании оператора + = перегрузка с шаблонами "Неразрешенный внешний символ" C ++ - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь перегрузить оператор += в моем классе, однако я получаю ошибки компоновщика.Ошибки следующие: LNK2019 unresolved external symbol "void __cdecl operator+=(class MyClass<int> &,int)" (??Y@YAXAAV?$MyClass@H@@H@Z) referenced in function _main Project2.Однако все, кроме части перегрузки оператора +=, работает так, как и ожидалось.

Вот мой код:

#include <iostream>

template <class T>
class MyClass
{
public:
    MyClass();
    void setVal(T x);
    T getVal();

    friend void operator +=(MyClass &my_obj, T val);

private:
    T val;
};

template <class T>
MyClass<T>::MyClass()
{}

template <class T>
void MyClass<T>::setVal(T x)
{
    val = x;
}

template <class T>
T MyClass<T>::getVal()
{
    return val;
}

//The trouble:
template <class T>
void operator +=(MyClass<T> &my_obj, T x)
{
    T new_val = my_obj.val;
    new_val += x;
    my_obj.setVal(new_val);
}

int main()
{
    MyClass<int> var = MyClass<int>();
    var.setVal(5);
    var += 1;

    std::cout << var.getVal() << std::endl;

    system("pause");
    return 0;
}

Я пытался найти похожие вопросы, но ничего не нашел.помог мне решить эту проблему.

1 Ответ

0 голосов
/ 26 июня 2018

Почему бы просто не определить функцию внутри класса?Таким образом, вы можете просто использовать

MyClass<T>& operator +=(const T& rhs)
{
    val += rhs;
    return *this;
}

Обратите внимание на использование += внутри реализации operator+=.Это работает, потому что += уже реализован, потому что это += для встроенных типов.Обычно вы должны использовать val = val + rhs, потому что вы реализуете +=, поэтому нет смысла использовать его внутри реализации.

Если вы хотите определить его вне класса, он собираетсябыть немного более хлопотным.

В вашем классе вам нужно объявить

template<typename U>
friend MyClass<U>& operator +=(MyClass<U>& lhs, const U& rhs);

Тогда для определения функции вне класса

template<typename U>
MyClass<U>& operator +=(MyClass<U>& lhs, const U& rhs)
{
  lhs.val += rhs;
  return lhs;
}
...