在模板 "Unresolved external symbol" C++ 中使用 += 运算符重载时出错
Error when using += operator overload with templates "Unresolved external symbol" C++
我试图在我的 class 中重载 +=
运算符,但是,我不断收到链接器错误。错误如下: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;
}
我尝试查找类似的问题,但没有找到任何可以帮助我解决此问题的内容。
为什么不直接在 class 中定义函数?这样,您就可以使用
MyClass<T>& operator +=(const T& rhs)
{
val += rhs;
return *this;
}
注意 +=
在 operator+=
的实现中的使用。这是有效的,因为 +=
已经实现,因为它是内置类型的 +=
。通常,你应该使用 val = val + rhs
因为你正在实现 +=
所以在实现中使用它没有意义。
如果要在class之外定义,会麻烦一些
在您的 class 中,您需要声明
template<typename U>
friend MyClass<U>& operator +=(MyClass<U>& lhs, const U& rhs);
然后在class
外进行函数定义
template<typename U>
MyClass<U>& operator +=(MyClass<U>& lhs, const U& rhs)
{
lhs.val += rhs;
return lhs;
}
我试图在我的 class 中重载 +=
运算符,但是,我不断收到链接器错误。错误如下: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;
}
我尝试查找类似的问题,但没有找到任何可以帮助我解决此问题的内容。
为什么不直接在 class 中定义函数?这样,您就可以使用
MyClass<T>& operator +=(const T& rhs)
{
val += rhs;
return *this;
}
注意 +=
在 operator+=
的实现中的使用。这是有效的,因为 +=
已经实现,因为它是内置类型的 +=
。通常,你应该使用 val = val + rhs
因为你正在实现 +=
所以在实现中使用它没有意义。
如果要在class之外定义,会麻烦一些
在您的 class 中,您需要声明
template<typename U>
friend MyClass<U>& operator +=(MyClass<U>& lhs, const U& rhs);
然后在class
外进行函数定义template<typename U>
MyClass<U>& operator +=(MyClass<U>& lhs, const U& rhs)
{
lhs.val += rhs;
return lhs;
}