我有一个模板结构“要点如下:
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等时,我可以编写该函数的多个副本。这对我来说很好用,但是我仍然想知道是否有更好的方法来解决这个问题,并且我是否只能像上面那样写一个副本?
答案 0 :(得分:1)
不要不必要地将运算符作为成员函数重载, 遵守here中所述的规则。
在我看来,让两个operator*
的{{1}}返回左一个实例的类型是没有意义的。最好在返回类型的推导中考虑这两种类型,因为该函数被定义为可交换的。
point
尝试对乘以标量的重载进行相同的练习。