xeus-cling定义返回pair的函数报function definition is not allowed here错误
报错原因
你引入的头文件完全正确,该报错是xeus-cling底层依赖的Cling C++解释器的语法解析规则特性导致的:
- 对于返回值为C++内置类型(比如int、float等)的全局函数,Cling可以直接正确识别为函数定义语句,正常编译运行,这也是你写的返回int版本的同逻辑函数可以正常运行的原因。
- 当函数返回值是复杂的模板类型(比如你用到的
pair<int,int>)时,Cling的语法解析器会误将开头的类型识别为表达式的一部分,无法判定这是一个函数定义的开头,因此抛出「不允许在此处定义函数」的错误。
解决方法
你可以任选以下任意一种方案解决:
方案1:给函数增加前置声明
在定义函数的单元格最上方,先写一行函数前置声明即可,完整代码如下:
// 先写前置声明,让Cling提前识别这是函数定义 pair<int,int> max_min_array(int *arr, int n); pair<int,int> max_min_array(int *arr, int n) { int min = arr[0], max = arr[0]; for(int i=1;i<n;i++) { if(arr[i] < min) min = arr[i]; else if(arr[i] > max) max = arr[i]; } return make_pair(min,max); }
方案2:用extern关键字修饰函数定义
直接在函数定义的返回类型前加extern关键字,显式告诉Cling这是全局函数定义,不需要额外加前置声明:
extern pair<int,int> max_min_array(int *arr, int n) { int min = arr[0], max = arr[0]; for(int i=1;i<n;i++) { if(arr[i] < min) min = arr[i]; else if(arr[i] > max) max = arr[i]; } return make_pair(min,max); }
方案3:将函数封装到命名空间中
如果你有多个返回复杂类型的函数,可以统一放到自定义命名空间里,也可以规避解析问题:
namespace utils { pair<int,int> max_min_array(int *arr, int n) { int min = arr[0], max = arr[0]; for(int i=1;i<n;i++) { if(arr[i] < min) min = arr[i]; else if(arr[i] > max) max = arr[i]; } return make_pair(min,max); } } // 调用的时候用utils::max_min_array即可
内容的提问来源于stack exchange,提问作者PSKP
相关产品推荐
相关产品推荐

