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)代码>