重载[]与+运算符遇Expected unqualified-id错误求助(Xcode+Google Test)
搞定C++里
->[]的语法错误问题 嘿,我一眼就看到你测试代码里的问题了——C++根本不支持->[]这种直接拼接的语法,这就是编译器报Expected unqualified-id的原因。
错误根源
你写的这两行代码:
ASSERT_EQ(8, speed_add->[0]); ASSERT_EQ(10, speed_add->[1]);
speed_add是Speed*类型的指针,->运算符的作用是访问指针指向对象的成员,它后面必须跟一个合法的成员名称(比如函数名、变量名)。而[]是你重载的运算符,本质是一个名为operator[]的成员函数,不能直接跟在->后面,编译器自然会懵圈报错。
两种快速修复方式
方式1:先解引用指针,再用[]
把指针转换成对象引用后,直接用[]就没问题了:
TEST (Speed, operatorPlus) { Speed speed_0(3, 4); Speed speed_1(5, 6); Speed * speed_add = speed_0 + speed_1; ASSERT_EQ(8, (*speed_add)[0]); // 先解引用指针得到对象,再调用[] ASSERT_EQ(10, (*speed_add)[1]); delete speed_add; // 重点!别忘了释放new出来的内存,不然会内存泄漏 }
方式2:显式调用operator[]函数
既然[]是成员函数,你可以直接通过指针调用它:
TEST (Speed, operatorPlus) { Speed speed_0(3, 4); Speed speed_1(5, 6); Speed * speed_add = speed_0 + speed_1; ASSERT_EQ(8, speed_add->operator[](0)); // 直接调用重载的运算符函数 ASSERT_EQ(10, speed_add->operator[](1)); delete speed_add; }
额外的优化建议(更优雅的写法)
你的operator+返回指针的做法其实不太推荐,会带来内存管理的负担。更符合C++惯例的是返回Speed对象而非指针:
// 修改Speed类里的operator+实现 Speed operator + (const Speed & s) const { return Speed(x + s[0], y + s[1]); }
这样测试代码就能变得更简洁,还不用手动释放内存:
TEST (Speed, operatorPlus) { Speed speed_0(3, 4); Speed speed_1(5, 6); Speed speed_add = speed_0 + speed_1; ASSERT_EQ(8, speed_add[0]); ASSERT_EQ(10, speed_add[1]); }
另外,建议给operator[]加一个const版本,这样const的Speed对象也能调用它:
// 在Speed类中添加const版本的operator[] const double & operator [] (int index) const { if (index == 0) return x; else if (index == 1) return y; else throw std::string("index error"); }
内容的提问来源于stack exchange,提问作者Neuenmuller
相关产品推荐
相关产品推荐

