关于编译器报错的问题
查看原帖
关于编译器报错的问题
1636470
shandianhailan楼主2025/7/30 18:32

首先思路是第一篇题解的思路,先给出第一篇题解的完整代码:

#include <cstdio>

const int N=24;
const int mod=1e9+7;
int n,m,b1,b2,dis[1<<N],f[1<<N];

void upd(int &x,int y) {(x+=y)>=mod&&(x-=mod);}
void solve(int x) {
    for(int i=x,j;i;i^=j) j=i&-i,upd(f[x],f[x^j]);
}
int main() {
    scanf("%d",&n);
    for(int i=0;i<n;++i) scanf("%d",&dis[1<<i]);
    scanf("%d",&m);
    if(m>0) scanf("%d",&b1);
    if(m>1) scanf("%d",&b2);
    f[0]=1;
    int msk=(1<<n)-1;
    for(int i=1;i<=msk;++i) {
        int j=i&-i;
        dis[i]=dis[i^j]+dis[j];
        if(dis[i]==b1||dis[i]==b2) continue;
        solve(i);
    }
    printf("%d\n",f[msk]);
    return 0;
}

然后,我按照这个思路写了一份代码,编译器一直报错,我的代码:

#include<iostream>
#define lowbit(x) (x&(-(x)))
using namespace std;
const int N=20,mod=1e9+7;
long long dp[1<<N],dis[1<<N];
int n,m,a[N],b[N];/*
以下注释掉的是我自己写的
inline void cal(int &x,int y) { (x+=y)>=mod&&(x-=mod); }
inline void solve(int x) { for(int i=x,j;i;i^=j) j=lowbit(i), cal(dp[x],dp[x^j]); }*/
void upd(int &x,int y) {(x+=y)>=mod&&(x-=mod);}
void solve(int x) {
    for(int i=x,j;i;i^=j) j=i&-i,upd(dp[x],dp[x^j]);
}
//这个是题解的函数,但是一样没有过编译器,照样报错。
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++) cin>>dis[1<<i-1];
	cin>>m;
	for(int i=1;i<=m;i++) cin>>b[i];
	dp[0]=1;
	int all=(1<<n)-1;
	for(int i=1;i<=all;i++)
	{
		int j=lowbit(i);
		dis[i]=dis[j]+dis[i^j];
		if(dis[i]==b[1] || dis[i]==b[2]) continue;
		solve(i);			
	}
	return 0;
}
//先不说我的思路或者写的对不对,现在是编译器的问题

提供一下报错的信息:

11 42 [Error] cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'.

大概就是说,当调用cal或solve函数时,如果传入的是临时计算结果或字面量(如cal(1,2)),就会触发这个错误‌ 2 右值(如1、a+b的结果)不能绑定到非const左值引用int&上‌

9 15 [Note] initializing argument 1 of 'void upd(int&, int)'

到底什么原因啊QWQ,查了资料也找不出来哪里有问题。。。

2025/7/30 18:32
加载中...