未解决的外部符号错误重载operator + template

时间:2016-07-05 12:07:31

标签: c++ templates operator-overloading

我正在尝试为类模板重载'+'运算符,但是使用中缀表示法调用它时出现未解析的外部符号错误:

// 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。

2 个答案:

答案 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_;   
};

Demo

否则你必须申报所有模板朋友

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

Demo

或只是特定的

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

Demo

答案 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_;   
};