C++ 尝试使用算术运算符阻止隐式转换

C++ 尝试使用算术运算符阻止隐式转换,c++,visual-studio,operator-overloading,implicit-conversion,C++,Visual Studio,Operator Overloading,Implicit Conversion,当使用算术运算符进行隐式转换时,是否有方法强制执行编译时错误。例如: class A: public: A operator + (const A tmp) const; void setX(const int X) void setY(const int Y) void setZ(const int Z) private: template <typename Y> Y operator +(const Y tmp); main: int a1 {2}; int a2 {3

当使用算术运算符进行隐式转换时,是否有方法强制执行编译时错误。例如:

class A:
public:
A operator + (const A tmp) const;
void setX(const int X)
void setY(const int Y)
void setZ(const int Z)
private: 
template <typename Y> 
Y operator +(const Y tmp);

main: 
int a1 {2};
int a2 {3};
int a3 {4}'

char b1 {2};
char v2 {3};
char b3 {4};

A a;
a.setX(a1);
a.sety(a2);
a.setz(a3);

A b;
b.setx(b1);
b.sety(b2);
b.setz(b3);
A d= a+b; //more or so of what i mean. This should be an error
A e= a+a;  // this should not be because its the same type



A类:
公众:
运算符+(常数A tmp)常数;
无效集合X(常数int X)
无效setY(常数int Y)
无效集合Z(常数整数Z)
私人:
模板
Y运算符+(常数Y tmp);
主要内容:
int a1{2};
int a2{3};
int a3{4}'
字符b1{2};
字符v2{3};
字符b3{4};
A A;
a、 setX(a1);
a、 sety(a2);
a、 setz(a3);
A b;
b、 setx(b1);
b、 sety(b2);
b、 setz(b3);
A d=A+b//差不多就是我的意思。这应该是一个错误
A e=A+A;//这不应该是因为它的类型相同

问题是,当我为操作符创建模板时,a+b和a+c都会生成一个错误。这让我很困惑,因为a+c是唯一应该生成错误的参数。

当两个参数的类型不匹配时,将进行隐式转换。你可以在编译的时候检查这个,比如

static_assert(std::is_same<decltype(a), decltype(c)>::value);
static_断言(std::is_same::value);

您需要提供一段实际可用于重现错误的代码<代码>a+b(其中
a
b
具有类型
int
)不应该导致编译时错误。不能更改C++类型的运算符,如<代码> int <代码> >代码> char < /C> >代码>双< /C> >等等。您只能为用户定义的类型做此操作。添加一些代码来让您了解IM的内容。about@Slava对于setX之类的方法,可以防止隐式转换,但对于接线员+?你的问题很令人困惑。
a
b
具有相同的类型,在类型系统中无法区分
a+b
a+a
。通过执行以下操作,可以强制模板不用于相同的类型:
template::value>::type>Y操作符+(const Y&tmp)