【问题标题】:Error when using += operator overload with templates "Unresolved external symbol" C++将 += 运算符重载与模板“未解析的外部符号”C++ 一起使用时出错
【发布时间】:2018-12-04 14:54:33
【问题描述】:

我正在尝试重载班级中的 += 运算符,但是,我不断收到链接器错误。错误如下: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;
}

我尝试查找类似的问题,但没有找到任何可以帮助我解决此问题的内容。

【问题讨论】:

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


【解决方案1】:

为什么不在类中定义函数呢?这样,你就可以使用

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;
}

【讨论】:

    猜你喜欢
    • 2016-06-19
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    相关资源
    最近更新 更多