Effective C++ 46. Define non-member functions inside templates when type conversions are desired

template<typename T>
class Rational {
public:
    Rational(const T& numerator = 0, const T& denominator = 1);
    const T numerator() const;
    const T denominator() const;
    ...
};

template<typename T>
const Rational<T> operator*(const Rational<T>& lhs, const Rational<T>& rhs) {
    ...
}
Rational<int> oneHalf(1, 2);
Rational<int> result = oneHalf * 2; // error! will not compile

because implicit type conversion functions are never considered during template argument deduction.
a friend declaration in a template class can refer to a specific function.

template<typename T>
class Rational{
public:
    ...
friend
    const Rational operator*(const Rational& lhs, const Rational& rhs);
};
template<typename T>
const Rational<T> operator*(const Rational<T>& lhs, const Rational<T>& rhs) {
    ...
}

As a declared functions ( not a function template), compiler can use implicit conversion functions.

the code will compile, it won’t link.
that function is only declared inside Rational, not defined there.

template<typename T>
class Rational{
public:
    ...
friend
    const Rational operator*(const Rational& lhs, const Rational& rhs) {
        return Rational(lhs.numerator() * rhs.numerator(), lhs.denominator() * rhs.denominator());

    }
};

have the friend call a heper

template<typename T>
class Rational{
public:
    ...
friend
    const Rational operator*(const Rational& lhs, const Rational& rhs) {
        return doMultiply(lhs, rhs);
    }
};
template<typename T>
const Rational<T> doMultiply(const Rational<T>& lhs, const Rational<T>& rhs) {
    return Rational(lhs.numerator() * rhs.numerator(), lhs.denominator() * rhs.denominator());
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值