C++:模板函数需要类型转换时使用友元(friend)模板函数

模板函数的隐式(implicit)类型转换, 涉及到模板参数(typename)的确定问题.

从int或double类型, 无法隐式转换为模板类(template class)的类型, 因为无法确定模板参数类型(typename), 就无法确定构造函数的参数.

所以需要使模板函数, 与模板类拥有相同的参数类型(typename), 则需要成为模板类的友元(friend).

模板类的友元, 会随着类的参数实例化, 而实例化参数类型, 从一个函数模板, 生成定制的函数, 即可以通过隐式类型转换.

因为生成了定制的函数, 所以无法找到外部的模板类定义, 可以通过:

1. 直接在友元函数内部, 实现代码(inline);

2. 在友元函数内部, 实现一个模板函数, 在把模板函数在外部实现.

代码如下:

/*
 * test.cpp
 *
 *  Created on: 2014.04.22
 *      Author: Spike
 */

/*eclipse cdt, gcc 4.8.1*/

#include <iostream>  

template<typename T> class Rational;  

template<typename T>
const Rational<T> doMultiply (const Rational<T>& lhs,
    const Rational<T>& rhs);  

//有理数
//更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/
template<typename T>
class Rational {
    /*friend const Rational<T> operator* (const Rational<T>& lhs,
        const Rational<T>& rhs) {
        return Rational<T>(lhs.numerator()*rhs.numerator(),
                lhs.denominator()*rhs.denominator());
    } //方法1*/
    friend const Rational<T> operator* (const Rational<T>& lhs,
        const Rational<T>& rhs) {
        return doMultiply(lhs, rhs);
    } //方法2
public:
    Rational(const T& numerator = 0, const T& denominator = 1) :
        m_n(numerator), m_d(denominator) {}
    const T numerator() const {return m_n;};
    const T denominator() const {return m_d;};
    const T value() {return (m_n/m_d);}
private:
    T m_n;
    T m_d;
};  

template<typename T>
const Rational<T> doMultiply (const Rational<T>& lhs,
        const Rational<T>& rhs) {
    return Rational<T>(lhs.numerator()*rhs.numerator(),
            lhs.denominator()*rhs.denominator());
}  

int main(void) {
    Rational<double> oneFourth(1, 4);
    Rational<double> result;
    result = oneFourth * 3.5;
    result = 3.5 * oneFourth;
    std::cout << "result = " << result.value() << std::endl;  

    return 0;
}

输出:

result = 0.875

作者:csdn博客 Spike_King

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索函数
, 友元
, 参数
, 模板函数
, 模板
, const
, 函数模板
, 类型
, 友元函数
, rational
, const函数
, 类的friend函数
, friend友元函数
rhs
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-09-28 22:32:47

C++:模板函数需要类型转换时使用友元(friend)模板函数的相关文章

以前编写JSP网站时写的一些工具函数

js|函数 初学JSP时,写了一些工具函数因为不太会用JAVA下的正则表达式也只能这么写啦!发出来让大家批评批评提点意见!有几个函数不算是自己写的希望爱挑剌的朋友嘴下留情!我是新手我怕谁,脸皮不行的人水平也上不去呀.嘻嘻.. package mxzc.web.strctrl;public class StringCtrl{/********************************************public synchronized String HTMLcode(String

编码显示c函数被调用时在源文件中的位置

问题描述 编码显示c函数被调用时在源文件中的位置 编码显示c函数被调用时在源文件中的位置. 例如 void test{ //在这里弹出对话框,显示被调用时的位置. } 在函数 void testCall(){ test(); //在这里弹出对话框,显示testCall 在源文件中的行号(+1) } 当执行到 testCall()时显示行test()所在行号---不是void test{}的行号,而是 void testCall(){}的行号(+1) 解决方案 这个像是编译器做的事情.分析源码吧

java中panel实现线程接口以后,要调用repaint函数时,不进run函数

问题描述 java中panel实现线程接口以后,要调用repaint函数时,不进run函数 具体情况是 mypanel类实现了线程接口,在run函数中定义了sleep(100)后调用repaint函数,做一个小坦克游戏,在repaint之前要判断是否击中坦克,击中后要显示三张图片来体现爆炸效果,可是经过调试发现,每次第一次击中的时候,都是直接好多次repaint,没有休眠,后来发现根本就没有进mypanel的run()方法,好像有另一个其他线程再调用paint.这是怎么回事?感谢大家了 pack

c语言-C语言求助!!!写了一个返回结构体指针的函数,编译时总是提醒没有初始化q,但是初始化了。

问题描述 C语言求助!!!写了一个返回结构体指针的函数,编译时总是提醒没有初始化q,但是初始化了. 下面是源码下载:http://pan.baidu.com/s/1dDhplwH 程序是用C语言写的,VS2013编译. 这是其中使用结构体的定义 这是哈夫曼函数的定义 解决方案 创建的时候可以 -- ,*q = NULL; malloc 之后 memset(q, 0 , sizeof(--)): 解决方案二: 创建的时候可以 -- ,*q = NULL; malloc 之后 memset(q, 0

test-这是我写的快速排序的算法,为什么编译时出错并提示“swap函数应输入两个参数,却提供了3个”啊

问题描述 这是我写的快速排序的算法,为什么编译时出错并提示"swap函数应输入两个参数,却提供了3个"啊 求助!这是我写的快速排序的算法,为什么编译时出错并提示"swap函数应输入两个参数,却提供了3个"啊~~谢谢大家啦! #include using namespace std; inline int findpivot(int arr[],int i,int j){ return (i+j)/2; } inline int partition(int arr[]

既然float不能表示所有的int,那为什么在类型转换时C++将int转换成float?

既然float不能表示所有的int,那为什么在类型转换时C++将int转换成float? 问题: 代码如下: int i = 23; float f = 3.14; if (i == f) // 执行某段代码 编译器会将i转换成float类型,然后比较这两个float的大小,但是float能够表示所有的int吗?为什么没有将int和float转换成double类型进行比较呢? 回答: 在整型数的演变中,当int变成unsigned时,会丢掉负数部分(有趣的是,这样的话,0u < -1就是对的了)

无-用java中的setRGB()函数处理像素时,像素值与处理结果一样,这是怎么回事?

问题描述 用java中的setRGB()函数处理像素时,像素值与处理结果一样,这是怎么回事? int rgb1=((allRGB[i][x+1][3]* 256 + allRGB[i][x+1][4]) * 256) + allRGB[i][x+1][5]; bimageIO[i].setRGB(allRGB[i][x+1][0]allRGB[i][x+1][1] rgb1);其中allRGB[i][x+1][0]图像的x坐标其中allRGB[i][x+1][1]图像的y坐标

c语言 结构体 指针-写了一个返回结构体指针的函数,编译时总是提醒没有初始化p,但是初始化了。

问题描述 写了一个返回结构体指针的函数,编译时总是提醒没有初始化p,但是初始化了. 源码 程序是用C写的,VS2013编译. 这是其中使用结构体的定义 这是哈夫曼函数的定义 解决方案 结构体指针的初始化 解决方案二: 哪有你所说的指针p啊 解决方案三: 是否用的c语言方式编译.编译器是否用c++方式编译

验证 C++ 内置类型的函数传参时用传值方式效率较高

在<Effective C++>里提到对内置(C-like)类型在函数传参时pass by value比pass by reference更高效,当用OO的c++自定义类型(存在构造/析构等)pass by reference to const 更好,STL里的迭代器和函数对象是用C指针实现的,因此pass by value更好.至于为什么,下面的代码验证了下. #include <iostream> using namespace std; int f(int i) {    i