C++中Bitmap对象构造语句被误识别为函数声明问题求助
问题根本原因
你遇到的是C中有名的**最令人烦恼的解析(Most Vexing Parse)**问题:C标准明确规定,若某条语句同时符合函数声明语法和对象定义语法,编译器必须优先将其解析为函数声明。
你写的Bitmap image(FileRead(filename))刚好满足歧义条件:
- 编译器会将参数中的
FileRead(filename)解读为FileRead filename(函数参数声明中包裹参数名的括号会被忽略),整行语句最终被解析为:声明一个返回值为Bitmap类型、名为image的函数,该函数接收1个类型为FileRead、名为filename的参数。 - 这也完全对应你观察到的VS工具提示结果,后续调用
image.getX()时报错,本质是你尝试对一个函数名调用成员方法,自然会触发编译错误。
为什么你修改后的写法能正常运行
- 对于
Bitmap image(FileRead("strLiteral")):参数中使用字符串字面量,不可能被解析为参数名,语句无法匹配函数声明语法,编译器只能将其解析为对象构造。 - 对于
Bitmap image(FileRead(filename), 4):多出来的第二个参数不符合单参数函数声明的语法,也无法被解析为函数声明。
通用解决方法
你可以选择以下任意一种无歧义的写法,避免语法歧义:
- 用C++11引入的统一初始化语法(最推荐,无歧义且可读性高):
Bitmap image{FileRead(filename)}; - 给构造参数额外加一层括号,破坏函数声明的语法匹配:
Bitmap image((FileRead(filename))); - 先单独构造
FileRead对象,再传入构造函数:FileRead fr(filename); Bitmap image(fr);
额外注意
你提供的Bitmap构造函数签名中第一个参数是FileRead & file,属于非常量左值引用,C++标准规定临时对象无法绑定到非常量左值引用,如果你在关闭VS非标准扩展的前提下编译仍报错,可以将该构造函数的第一个参数修改为const FileRead & file(常量左值引用)或者FileRead && file(右值引用)即可。
内容的提问来源于stack exchange,提问作者Anne Quinn
相关产品推荐
相关产品推荐

