zoukankan      html  css  js  c++  java
  • Effective C++ Item 46 当需要投你非成员函数定义模板

    本文senlie原版的,转载请保留此地址:http://blog.csdn.net/zhengsenlie


    经验:当我们编写一个 class template, 而它所提供之"与此 template 相关的"函数支持"全部參数之隐式类型转换"时。请将那些函数定义为 "class template内部的 friend 函数"。

    演示样例:
    template<typename T>
    class Rational{
    public:
    	Rational(const T &numerator = 0, const T &denominator = 1) // Item 20 对于自己定义类型以passed by reference方式传递參数。这里T有可能是内置类型或自己定义类型。
    	const T numerator() const; //Item 28 避免返回 handles 指向对象内部成分。 
    	const 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


    解析: operator* 接受两个 Rational<T> 參数,但它没能推导出 T 是什么
    operator* 的第一參数被声明为 Rational <T>。而传递给 operator* 的第一实參(oneHalf)的类型是 Rational<int>,所以T一定是 int
    operator* 的第二參数被声明为 Rational <T>,而传递给 operator* 的第二实參(2)的类型是 int。编译器无法推导出 T 是什么


    纠正1:将 operator*声明为Rational<T> class 的 friend函数。 能编译成功,不能链接成功
    template<typename>
    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){
    	...
    }


    解析:oneHalf 为 Rational<int>, 详细化出了 class Rational<int>。 也对应地详细化出了接受 Rational<int> 參数的 operator* 。使它成为一个函数而非函数模板。
    但那个详细化的函数是在 Rational template 里声明的。而 Rational template 外的 operator* 并没有详细化出它的定义。




    纠正2:把 operator* 函数本体合并至声明式内

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


  • 相关阅读:
    AOP概述
    AOP-动态代理
    IOC容器和Bean的配置
    Spring框架概述
    异常
    Optional 类
    Stream API
    方法引用(Method References)
    函数式(Functional)接口
    stm8笔记1-搭建工程+孤独的小灯闪烁
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4605958.html
Copyright © 2011-2022 走看看