使用decltype检测Polygon类scale方法类型时出现未声明错误求助
错误原因及修正方法
核心问题
编译报错的原因很直接:scale是Polygon类的非静态成员函数,仅属于Polygon类的作用域。你在main函数的全局作用域中直接写decltype(scale),编译器会在全局范围内查找名为scale的实体,自然找不到,因此抛出未声明的错误。
正确写法
要获取成员函数的类型,需要满足三个要点:
- 用类名限定成员函数的作用域:
Polygon::scale - 取成员函数的地址(
decltype获取成员函数类型时,必须通过成员函数指针的形式) - 非静态成员函数的类型格式为
返回值类型 (类名::*)(参数列表),而非你写的void (Polygon*,double)——后者是对成员函数调用时隐式传递this指针的逻辑模拟,但不是C++中成员函数指针的实际类型。
修正后的判断代码如下:
if(!std::is_same<decltype(&Polygon::scale), void (Polygon::*)(double)>::value){ cout<<'p'; }
补充说明
如果想通过对象实例推导类型,也可以写成decltype(&decltype(polygon)::scale),效果和decltype(&Polygon::scale)一致,但直接使用类名的写法更清晰直观。
内容的提问来源于stack exchange,提问作者lelumpolelum
相关产品推荐
相关产品推荐

