将+ =运算符重载与模板“未解析的外部符号”一起使用时出错C ++

时间:2018-06-26 00:51:32

标签: c++ visual-studio templates operator-overloading linker-errors

我正在尝试重载类中的+=运算符,但是,我不断收到链接器错误。错误如下: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 :(得分:0)

为什么不只在类内部定义函数?这样,您可以使用

Tools>Options

请注意在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);