我正在尝试为类模板重载'+'
运算符,但是使用中缀表示法调用它时出现未解析的外部符号错误:
// 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
}
它适用于常规的非模板类,所以想知道是否有可能在这里实现相同的东西。
我正在使用Visual C ++ 2015。
答案 0 :(得分:3)
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_);
}
答案 1 :(得分:0)
您尚未将其定义为类中的模板。 最简单的解决方案是在类中定义函数(内联):
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_;
};