模板结构的C ++运算符重载

时间:2019-02-23 12:10:09

标签: c++ templates operator-overloading

我有一个模板结构“要点如下:

point<double> p1{1,2,3};
point<float> p2{1,2,3}; 

point<double> p3 = p1*p3;

两个声明为成员函数的运算符重载函数,第一个应该与另一个点相乘,另一个要从右侧的常数乘以一个点,其中一个要在结构外部声明同样的事情,但从左侧开始。

现在我去编译以下代码:

error: cannot convert ‘point<double>’ to ‘float’ in initialization
             return point<T1>{p.x*v, p.y*v, p.z*v};

编译器调用在结构体外部声明的那个,而不是声明为成员函数的那个​​,并产生错误:

<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:ls="https://www.littlstar.com">
<channel>
    <title><![CDATA[Name (46 videos)]]></title>
    <description><![CDATA[Name]]></description>
    <link>http://github.com/dylang/node-rss</link>
    <image>
        <url>http://1.1.1.1:3001/thumb\324bfb0834915ccc0edb73b5bf0b82c2.jpeg</url>
        <title>bla bla</title>
        <link></link>
    </image>
    <generator>RSS for Node</generator>
    <lastBuildDate>Sat, 23 Feb 2019 11:32:08 +0000</lastBuildDate>
    <category><![CDATA[Local]]></category>
....

这很有意义,因为两个参数都是模板变量,可以解释为点变量。现在,第二个变量只能是一个点变量,但第一个变量可以是任何东西!

为解决这个问题,当一次将第一个参数声明为int,float,double,long double等时,我可以编写该函数的多个副本。这对我来说很好用,但是我仍然想知道是否有更好的方法来解决这个问题,并且我是否只能像上面那样写一个副本?

1 个答案:

答案 0 :(得分:1)

不要不必要地将运算符作为成员函数重载,  遵守here中所述的规则。

在我看来,让两个operator*的{​​{1}}返回左一个实例的类型是没有意义的。最好在返回类型的推导中考虑这两种类型,因为该函数被定义为可交换的。

point

尝试对乘以标量的重载进行相同的练习。