未解析的外部符号错误重载操作符+模板
Unresolved external symbol error overloading operator+ template
我试图重载'+'
操作符为类模板,但得到无法解决的外部符号错误调用它使用中义符号:
// In main.cpp
template<class T>
struct B
{
B(T t) : t_(t) {}
friend B operator+(B const &lhs, B const &rhs);
T t_;
};
template<class T>
B<T> operator+(B<T> const &lhs, B<T> const &rhs)
{
return B<T>(lhs.t_ + rhs.t_);
}
int main()
{
B<int> b = 1;
b = operator+<int>(b, 2); // works but clunky syntax
// b = b + 2; // LNK2019: unresolved external symbol
}
对于普通的非模板化类它工作得很好,所以想知道是否有可能在这里实现同样的事情。
friend B operator+(B const &lhs, B const &rhs);
是一个非模板函数
更简单的定义是:inline
:
template<class T>
struct B
{
B(T t) : t_(t) {}
friend B operator+(B const &lhs, B const &rhs)
{
return B(lhs.t_ + rhs.t_);
}
T t_;
};
演示否则你必须声明所有的模板友元
template <typename T> struct B;
template <typename T> B<T> operator+(B<T> const &lhs, B<T> const &rhs);
template<class T>
struct B
{
B(T t) : t_(t) {}
template <typename U>
friend B<U> operator+(B<U> const &lhs, B<U> const &rhs);
T t_;
};
演示或者只指定一个
template <typename T> struct B;
template <typename T> B<T> operator+(B<T> const &lhs, B<T> const &rhs);
template<class T>
struct B
{
B(T t) : t_(t) {}
friend B operator+<>(B const &lhs, B const &rhs);
// Note the <>
T t_;
};
template<class T>
B<T> operator+(B<T> const &lhs, B<T> const &rhs)
{
return B<T>(lhs.t_ + rhs.t_);
}
演示您没有将其定义为类中的模板。最简单的解决方案是在类内部定义函数(内联):
template<class T>
struct B
{
B (T t) : t_ (t) {}
friend B operator+ (const B &lhs, const B &rhs)
{
return B (lhs.t_ + rhs.t_);
}
T t_;
};
相关文章:
- 重载操作符+:表达式必须是整型或无作用域枚举类型
- 重载操作符
- 如何重载操作符==外模板类使用友元函数
- 重载*操作符,使其在左右两边都工作
- 重载操作符<对于非随机迭代器
- 在c++中重载操作符的时间和原因
- 如何在c++中重载=操作符来通过引用进行复制
- 如何在c++中获取定义为友元的重载操作符的地址
- 使用重载操作符的文件操作表达式没有给出预期的结果
- 重载操作符()
- 重载操作符()并在类内使用
- 类中的重载操作符+
- 定时使用重载操作符
- c++带类的重载操作符
- 用列表容器重载[]操作符
- 重载操作符=
- 任何重载操作符()的静态检测
- 重载操作符以处理类对象
- 在使用另一个类的类中重载操作符==
- 派生类和基类中的重载操作符不同