C++代码中Int类转long double触发语法错误,求解答
自定义Int类重载运算符时类型转换错误的原因与解决方法
错误原因
编译报错expected primary expression before 'long'的根源在于类对象的强制转换语法错误:
- 代码中
long double (a)的写法试图将Int类对象a直接转换为long double类型,但C++不支持这种针对类对象的强制转换语法。 - 虽然你定义了
operator int()转换运算符(允许Int转int),但long double(a)这种写法无法触发该转换,编译器会将long识别为语法错误的起始部分,因为它找不到合法的表达式。
解决方法
有两种简洁且规范的修复方式:
方式1:利用现有int转换运算符,分步转换
先将Int对象转为int,再转为long double,使用static_cast完成类型转换(符合C++类型转换规范):
修改运算符重载函数中的转换代码,例如加法重载:
Int operator + (Int a) { return checkit( static_cast<long double>(number) + static_cast<long double>(static_cast<int>(a)) ); }
同理修改-、*、/运算符中的对应转换部分。
方式2:添加long double转换运算符
在Int类的public区域添加直接转long double的转换运算符,这样long double(a)的写法就会被编译器正确识别:
operator long double() { return static_cast<long double>(number); }
添加后,原代码中long double(number)和long double(a)的写法都能正常工作,无需修改运算符重载的逻辑。
修改后的完整代码示例(以方式2为例)
#include<iostream> using namespace std; class Int { private: int number; public: Int() : number(0) // 无参构造函数 { } Int( int i) : number(i) // 单参构造函数 { } void putInt() // 输出Int类数据 { cout << number; } void getInt() // 从用户处获取数据 { cin >> number; } operator int() // 转换运算符(Int转int) { return number; } operator long double() // 新增:Int转long double { return static_cast<long double>(number); } Int operator + ( Int a) { return checkit( long double (number) + long double (a)) ; } // 实现两个Int类对象的加法 Int operator - ( Int a) { return checkit(long double (number) - long double (a) ); } // 实现两个Int类对象的减法 Int operator * (Int a) { return checkit( long double (number) * long double (a) ); } // 实现两个Int类对象的乘法 Int operator / (Int a) { return checkit( long double (number) / long double (a) ); } // 实现两个Int类对象的除法 Int checkit( long double answer) { if( answer > 2147483647.0L || answer < - 2147483647.0L) { cout << "\nOverflow Error\n"; exit(1); } return Int ( int(answer)); } }; int main() { Int numb1 = 20; Int numb2 = 7; Int result, cNumber; result = numb1 + numb2; cout << "\nresult = "; result.putInt(); //27 result = numb1 - numb2; cout << "\nresult = "; result.putInt(); //13 result = numb1 * numb2; cout << "\nresult = "; result.putInt(); // 140 result = numb1 / numb2; cout << "\nresult = "; result.putInt(); // 2 cNumber = 2147483647; result = numb1 + cNumber; // 溢出错误 cout << "\nresult = "; result.putInt(); cNumber = -2147483647; result = numb1 + cNumber; // 溢出错误 cout << endl; return 0; }
内容的提问来源于stack exchange,提问作者Nitish Kumar Mishra
相关产品推荐
相关产品推荐

