构造函数匹配失败求助:指针与引用参数适配疑问
问题解决方案
1. 核心参数不匹配问题
你的Player构造函数接收permutation_t*类型参数,但add_player传入的是const permutation_t&,两种类型无法自动转换,直接导致编译报错。提供两种解决思路:
推荐方案:修改构造函数参数为
const permutation_t&
引用比指针更安全,且完全匹配传入的参数类型,同时类成员需对应设为const引用(因为传入的是const对象,不能通过非const引用修改):class Player { public: // 构造函数参数改为const引用 Player(const permutation_t& spirit) : spirit_(spirit) {} private: // 成员变量对应设为const引用,必须在初始化列表初始化 const permutation_t& spirit_; };备选方案:保留指针参数但适配const属性
如果必须用指针,需将构造函数参数改为const permutation_t*,调用时取传入对象的地址:class Player { public: Player(const permutation_t* spirit) : spirit_(spirit) {} private: const permutation_t* spirit_; }; // 在add_player中调用 void add_player(const permutation_t& spirit) { Player p(&spirit); }注意:必须保证传入对象的生命周期长于Player实例,避免悬空指针。
2. 关于int&和普通int的识别差异
你遇到的int&能匹配但普通int不行的情况,大概率是构造函数重载或引用绑定规则导致的:
- 如果你的构造函数只有
Player(int& num),传入右值(比如直接传5)会报错,因为非const引用无法绑定右值;但传入左值(比如定义好的int a = 5)可以正常匹配。 - 解决方法:要么新增接受普通
int的构造函数,要么把引用改成const int&(可同时绑定左值和右值):// 方案1:新增传值构造函数 Player(int num) : num_(num) {} // 方案2:改用const引用 Player(const int& num) : num_(num) {}
3. 指针改引用仍未解决的原因
你之前修改成员为引用但没解决问题,大概率是两个原因:
- 构造函数的参数类型没同步修改,依然是
permutation_t*,参数不匹配的核心问题没解决; - 引用成员未设为
const,但传入的是const permutation_t&,编译器不允许将const引用绑定到非const引用成员上。
内容的提问来源于stack exchange,提问作者Algo
相关产品推荐
相关产品推荐

