![](/img/trans.png)
[英]Inheriting from a templated class with operator overloading. ambiguous overload for 'operator*'
[英]operator= Overload from a templated class
我有一个项目,所有的类都将以int,double和float为模板,getCoordinate返回CCoordinate类型的对象。
tempCoordinate = m_shapes.at(i)->getCoordinate(j);
在应用模板之前,它已经正常工作。 但是随后出现一些错误。
据我了解,我需要丢失和operator =重载以强制转换值,以防万一例如我有一个浮点数并且我收到一个整数,例如:
CCoordinate<float> coorFloat;
CCoordinate<int> coorInt = coorFloat
如何在课堂上创建这个? 需要什么格式? 。
我以为它应该看起来像这样,但显然我弄错了。
//CCoordinate.h
template<class T>
class CCoordinate {
//Code
public:
template<class U> template <class U> CCoordinate<T>
operator= (const CCoordinate<U>& c1);
}
//CCoordinate.cpp
template <class U >
CCoordinate<U> CCoordinate<T>::operator= (const CCoordinate<U>& c1)
{
// some kind of casting ?
}
我的错误:
19:06:43 **** Incremental Build of configuration Debug for project ShapesRefV2 ****
Info: Internal Builder is used for build
g++ -O0 -g3 -Wall -c -fmessage-length=0 -Werror=return-type -o "myCode\\CRectangle.o" "..\\myCode\\CRectangle.cpp"
g++ -O0 -g3 -Wall -c -fmessage-length=0 -Werror=return-type -o "myCode\\CPlane.o" "..\\myCode\\CPlane.cpp"
..\myCode\CPlane.cpp: In instantiation of 'GraSys::CRectangle<T> GraSys::CPlane<T>::boundingBox(std::string, std::string) [with T = int; std::string = std::basic_string<char>]':
..\myCode\CPlane.cpp:165:24: required from here
..\myCode\CPlane.cpp:115:20: error: no match for 'operator=' (operand types are 'GraSys::CCoordinate<double>' and 'const GraSys::CCoordinate<int>')
tempCoordinate = m_shapes.at(i)->getCoordinate(j);
^
..\myCode\CPlane.cpp:115:20: note: candidate is:
In file included from ..\myCode\CGraphicElement.h:14:0,
from ..\myCode\CPlane.h:11,
from ..\myCode\CPlane.cpp:9:
..\myCode\CCoordinate.h:17:7: note: GraSys::CCoordinate<double>& GraSys::CCoordinate<double>::operator=(const GraSys::CCoordinate<double>&)
class CCoordinate
^
..\myCode\CCoordinate.h:17:7: note: no known conversion for argument 1 from 'const GraSys::CCoordinate<int>' to 'const GraSys::CCoordinate<double>&'
..\myCode\CPlane.cpp: In instantiation of 'GraSys::CRectangle<T> GraSys::CPlane<T>::boundingBox(std::string, std::string) [with T = float; std::string = std::basic_string<char>]':
..\myCode\CPlane.cpp:166:24: required from here
..\myCode\CPlane.cpp:115:20: error: no match for 'operator=' (operand types are 'GraSys::CCoordinate<double>' and 'const GraSys::CCoordinate<float>')
tempCoordinate = m_shapes.at(i)->getCoordinate(j);
^
..\myCode\CPlane.cpp:115:20: note: candidate is:
In file included from ..\myCode\CGraphicElement.h:14:0,
from ..\myCode\CPlane.h:11,
from ..\myCode\CPlane.cpp:9:
..\myCode\CCoordinate.h:17:7: note: GraSys::CCoordinate<double>& GraSys::CCoordinate<double>::operator=(const GraSys::CCoordinate<double>&)
class CCoordinate
^
..\myCode\CCoordinate.h:17:7: note: no known conversion for argument 1 from 'const GraSys::CCoordinate<float>' to 'const GraSys::CCoordinate<double>&'
19:06:44 Build Finished (took 674ms)
在成员声明中,您的template <class U>
太多了,成员应返回对*this
的引用,因此它需要返回CCordinate &
(如果省略,则意味着<T>
):
// Remove this vvvvvvvvvvvvvvvvvv
template<class U> /* template <class U> */
CCoordinate & operator= (const CCoordinate<U>& c1);
// ^- Return type changed to be a reference.
由于成员是模板,而类是模板,因此有两个级别的模板。 实现成员时,您需要指定两个级别。
它还返回错误的类型(它返回CCoordinate<U>
但是您已在类中声明它返回CCoordinate<T>
)。
// You need the T template as well.
// vvvvvvvvvvvvvvv
template <class T>
template <class U>
CCoordinate<T> & CCoordinate<T>::operator= (const CCoordinate<U>& c1)
// ^ ^- Added reference as per above.
// \---- Changed to T; U makes no sense here and conflicts with your member
// declaration in the class.
{
// Your logic to make the conversion.
return *this;
}
您的尝试有两个问题。 更简单的问题是, operator=
的声明语法具有额外的template <class U>
。 它看起来应该像这样:
template<class U> CCoordinate<T>
operator= (const CCoordinate<U>& c1);
但是,即使是正确定义的operator=
也不允许您编写
CCoordinate<float> coorFloat;
CCoordinate<int> coorInt = coorFloat;
这是因为copy上方的第二行初始化了 coorInt
。 在复制初始化时不考虑使用operator=
-它仅查看用户定义的转换 ,在这种情况下,该转换仅包括非显式构造函数和非显式转换函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.