模板类重载操作符+ - * /,同时可继承

dabing0617 2019-01-24 02:35:29
最近在重构自己的代码,简化重复性内容,遇到如下问题,继承后报错,我也是刚接触模板类没多久,求指教

#include "stdafx.h"

template<class T2>
class S {
public:
S<T2> operator= (S<T2>& lhs)
{
S<T2> temp(lhs);
int k = sizeof(T2);
int n = sizeof(S<T2>) / k;
for (int i = 0; i < n; i++)
{
T2 a = *(T2*)(int(&lhs) + k);
T2 b = *(T2*)(int(&rhs) + k);
*(T2*)(int(&temp) + k) = a + b;
}
return temp;
}

friend S<T2> operator+ (S<T2>& lhs, S<T2>& rhs)
{
S<T2> temp(lhs);
int k = sizeof(T2);
int n = sizeof(S<T2>) / k;
for (int i = 0; i < n; i++)
{
T2 a = *(T2*)(int(&lhs) + k);
T2 b = *(T2*)(int(&rhs) + k);
*(T2*)(int(&temp) + k) = a + b;
}
return temp;
}
};
template<class T2>
class A :public S<T2>
{
public:
T2 x = 0;
T2 y = 2;
T2 z = 5;

};

int main()
{
S<double> a1;
S<double> b1;
S<double> c1 = a1 + b1;//该行通过

A<double> a;
A<double> b;
A<double> c=a+b;//该行报错
return 0;
}

...全文
128 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dabing0617 2019-01-24
  • 打赏
  • 举报
回复
引用 2 楼 WNs_ACE 的回复:
我记得是类继承了模板类后,调用模板类的方法会出现问题的,建议看看第条款43(http://www.cnblogs.com/yyxt/p/4821359.html),里面有很详细的讲
受到里面这篇文章启发,代码改成如下解决了
#include "stdafx.h"

template<class T2> class S {
public:
	template<typename C> C operator+ (C& lhs)
	{
		C temp;
		int k = sizeof(T2);
		int n = sizeof(lhs) / k;
		for (int i = 0; i < n; i++)
		{
			T2 a = *(T2*)(int(this) + k*i);
			T2 b = *(T2*)(int(&lhs) + k*i);
			*(T2*)(int(&temp) + i*k) = a + b;
		}
		return temp;
	}
};
template<class T2> class A :public S<T2>
{
public:
	T2 x = 0;
	T2 y = 2;
	T2 z = 5;

};

int main()
{
	S<double> a1;
	S<double> b1;
	S<double> c1 = a1 + b1;//该行通过

	A<double> a;
	A<double> b; 
	a.x = 2;
	a.y = 5;
	a.z = 9;
	A<double> c= a + b;//该行报错
    return 0;
}
dabing0617 2019-01-24
  • 打赏
  • 举报
回复
受到WNs_ACE 的回复中的链接启发,把代码改成如下,解决了
#include "stdafx.h"

template<class T2> class S {
public:
	template<typename C> C operator+ (C& lhs)
	{
		C temp;
		int k = sizeof(T2);
		int n = sizeof(lhs) / k;
		for (int i = 0; i < n; i++)
		{
			T2 a = *(T2*)(int(this) + k*i);
			T2 b = *(T2*)(int(&lhs) + k*i);
			*(T2*)(int(&temp) + i*k) = a + b;
		}
		return temp;
	}
};
template<class T2> class A :public S<T2>
{
public:
	T2 x = 0;
	T2 y = 2;
	T2 z = 5;

};

int main()
{
	S<double> a1;
	S<double> b1;
	S<double> c1 = a1 + b1;//该行通过

	A<double> a;
	A<double> b; 
	a.x = 2;
	a.y = 5;
	a.z = 9;
	A<double> c= a + b;//该行报错
    return 0;
}
独孤过 2019-01-24
  • 打赏
  • 举报
回复
S<T2>有匹配的重载+运算符,而A<T2>没有匹配的重载+运算符,编译器检测到A继承S,于是进行隐式向上类型转换,把A<T2>转换为S<T2>引用类型,这样可以匹配重载+运算符,但是重载+运算符函数返回S<T2>类型值,由于向下类型转换不安全,不能够隐式向下类型转换,即S<T2>值无法自动转换成A<T2>,所以编译器报错“不存在用户定义的从"S<double>"到"A<double>"的适当转换”。
WNs_ACE 2019-01-24
  • 打赏
  • 举报
回复
我记得是类继承了模板类后,调用模板类的方法会出现问题的,建议看看第条款43(http://www.cnblogs.com/yyxt/p/4821359.html),里面有很详细的讲
cwenhe0324 2019-01-24
  • 打赏
  • 举报
回复
首先: a+b生成的是S<double>, 是A<double>的父类,不能直接强转所以导致编译错误 其次: friend S<T2> operator+ (S<T2>& lhs, S<T2>& rhs)中使用sizeof计算出来的都是S<T2>的大小,这个有问题的

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧