vs2010 error:1个无法解析的外部命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vs2010 error:1个无法解析的外部命令相关的知识,希望对你有一定的参考价值。

#include<iostream>
using namespace std;
//----------------------------------------------------------------
template<class Typew,class Typep>
class Knap
friend Typep Knapsack(Typep * ,Typew * ,Typew,int);
private:
Typep Bound(int i);
void Backtrack(int i);
Typew c;
int n;
Typew *w;
Typep *p;
Typew cw;
Typep cp;
Typep bestp;
;
//----------------------------------------------------------------
template<class Typew,class Typep>
void Knap<Typew,Typep>::Backtrack(int i)

if(i<n)bestp=cp;return;
if(cw+w[i]<=c)
cw+=w[i];
cp+=p[i];
Backtrack(i+1);
cw-=w[i];
cp-=p[i];
if(Bound(i+1)>bestp)
Backtrack(i+1);

//----------------------------------------------------------------
template<class Typew,class Typep>
Typep Knap<Typew,Typep>::Bound(int i)

Typew cleft = c-cw;
Typep b=cp;
while(i<=n && w[i]<=cleft)

cleft-=w[i];
b+=p[i];
i++;

if(i<=n)
b+=p[i]*cleft/w[i];
return b;

//----------------------------------------------------------------
class Object
friend int Knapsack(int *,int *,int,int);
public:
int operator<=(Object a)const
return (d>=a.d);
private:
int ID;
float d;
;
//----------------------------------------------------------------
template<class Typew,class Typep>
Typep Knapsack(Typep p[],Typew w[],Typew c,int n)

Typew W=0;
Typep P=0;
Object *Q = new Object[n];
for(int i=1;i<=n;i++)

Q[i-1].ID = i;
Q[i-1].d = 1.0*p[i]/w[i];
P+=p[i];
W+=W[i];

if(W<=c) return P;
Sort(Q,n);
Knap<Typew,Typep> K;
K.p = new Typep [n+1];
K.w = new Typew [n+1];
for(int i=1;i<=n;i++)

K.p[i] = p[Q[i-1].ID];
K.w[i] = w[Q[i-1].ID];

K.cp = 0;
K.cw = 0;
K.c = c;
K.n = n;
K.bestp = 0;

K.Backtrack(1);
delete []Q;
delete []K.w;
delete []K.p;
return K.bestp;

//----------------------------------------------------------------
int main()

int n,c;
cout<<"请输入物品数量和背包容量(全为0退出程序):";
while(cin>>n>>c && n && c)

int *p = new int[n+1];
int *w = new int[n+1];
cout<<"随机生成的物品重量和价值为:"<<endl;
for(int i=1;i<=n;i++)

w[i] = rand()%c+1;
p[i] = rand()%100+1;
cout<<i<<" "<<w[i]<<" "<<p[i]<<endl;

int bestp = Knapsack(p,w,c,n);
cout<<"最优价值为"<<bestp<<endl<<endl;
cout<<"***************************************************"<<endl;
cout<<"请输入物品数量和背包容量(全为0退出程序):";


1>01背包.obj : error LNK2019: 无法解析的外部符号 "int __cdecl Knapsack(int *,int *,int,int)" (?Knapsack@@YAHPAH0HH@Z),该符号在函数 _main 中被引用
1>C:\Users\admin\Desktop\台州好学生\算法\第5章\01背包\Debug\01背包.exe : fatal error LNK1120: 1 个无法解析的外部命令<!--<!--

1)friend Typep Knapsack(Typep * ,Typew * ,Typew,int);
定义错误,这么不包含 Knap<Typep ,Typew >类型的参数,不能为类Knap<Typep ,Typew >的友元函数
class Object
2) friend int Knapsack(int *,int *,int,int);
这个函数也不能是类不能为,类 Object友元函数。
所以类型template<class Typew,class Typep>
class Knap和类型class Object没有定义,编译不能通过;
所以 函数模板template<class Typew,class Typep>
Typep Knapsack(Typep p[],Typew w[],Typew c,int n) 编译不能通过;
所以
函数
int __cdecl Knapsack(int *,int *,int,int)" (?Knapsack@@YAHPAH0HH@Z)没有定义。
即main 内部的函数调用
int bestp = Knapsack(p,w,c,n);不能编译通过,所以链接不了,出错了。追问

能帮我修改一下吗

追答

建议Knapsack不要写成友元函数;
两个类改成结构,不知你这个程序是做什么用的;
感觉逻辑,设计的有点乱。

如果非要把Knap和 Object写成类的话建议,用这两个类,或者其中一个类做参数
把函数写成两个类的友元函数,或者其中一个类的成员函数,另一个类的友元函数。

主要不明白你的逻辑是什么!!!
这个函数只是使用一下Object和Knap两个数据结构,为何非要做友元函数???

参考技术A #include<iostream>
using namespace std;
//----------------------------------------------------------------
template<class Typew,class Typep>
class Knap
friend Typep Knapsack(Typep * ,Typew * ,Typew,int);
private:
Typep Bound(int i);
void Backtrack(int i);
Typew c;
int n;
Typew *w;
Typep *p;
Typew cw;
Typep cp;
Typep bestp;
;
//----------------------------------------------------------------
template<class Typew,class Typep>
void Knap<Typew,Typep>::Backtrack(int i)

if(i<n)bestp=cp;return;
if(cw+w[i]<=c)
cw+=w[i];
cp+=p[i];
Backtrack(i+1);
cw-=w[i];
cp-=p[i];
if(Bound(i+1)>bestp)
Backtrack(i+1);

//----------------------------------------------------------------
template<class Typew,class Typep>
Typep Knap<Typew,Typep>::Bound(int i)

Typew cleft = c-cw;
Typep b=cp;
while(i<=n && w[i]<=cleft)

cleft-=w[i];
b+=p[i];
i++;

if(i<=n)
b+=p[i]*cleft/w[i];
return b;

//----------------------------------------------------------------
class Object
friend int Knapsack(int *,int *,int,int);
public:
int operator<=(Object a)const
return (d>=a.d);
private:
int ID;
float d;
;
//----------------------------------------------------------------
template<class Typew,class Typep>
Typep Knapsack(Typep p[],Typew w[],Typew c,int n)

Typew W=0;
Typep P=0;
Object *Q = new Object[n];
for(int i=1;i<=n;i++)

Q[i-1].ID = i;
Q[i-1].d = 1.0*p[i]/w[i];
P+=p[i];
W+=W[i];

if(W<=c) return P;
Sort(Q,n);
Knap<Typew,Typep> K;
K.p = new Typep [n+1];
K.w = new Typew [n+1];
for(int i=1;i<=n;i++)

K.p[i] = p[Q[i-1].ID];
K.w[i] = w[Q[i-1].ID];

K.cp = 0;
K.cw = 0;
K.c = c;
K.n = n;
K.bestp = 0;

K.Backtrack(1);
delete []Q;
delete []K.w;
delete []K.p;
return K.bestp;

//----------------------------------------------------------------
int main()

int n,c;
cout<<"请输入物品数量和背包容量(全为0退出程序):";
while(cin>>n>>c && n && c)

int *p = new int[n+1];
int *w = new int[n+1];
cout<<"随机生成的物品重量和价值为:"<<endl;
for(int i=1;i<=n;i++)

w[i] = rand()%c+1;
p[i] = rand()%100+1;
cout<<i<<" "<<w[i]<<" "<<p[i]<<endl;

int bestp = Knapsack(p,w,c,n);
cout<<"最优价值为"<<bestp<<endl<<endl;
cout<<"***************************************************"<<endl;
cout<<"请输入物品数量和背包容量(全为0退出程序):";


1>01背包.obj : error LNK2019: 无法解析的外部符号 "int __cdecl Knapsack(int *,int *,int,int)" (?Knapsack@@YAHPAH0HH@Z),该符号在函数 _main 中被引用
1>C:\Users\admin\Desktop\台州好学生\算法\第5章\01背包\Debug\01背包.exe : fatal error LNK1120: 1 个无法解析的外部命令<!--<!--追问

有修改哪里吗

追答

Typew c;
int n;
Typew *w;
Typep *p;HPAH0HH@Z),该符号在函数 _main 中被引用
1>C:\Users\admin\Desktop\台州好学生\算法\第5章\01背包\Debug\01背包.exe : fatal error LNK1120: 1 个无法解析的外部命令 K;
K.p = new Typep [n+1];
K.w = new Typew [n+1];
for(int i=1;i<=n;i++)

p[i] = rand()%100+1;
cout<<i<<" "<<w[int *p = new int[n+1];
int *w = new int[n+1];
cout<<"随机生成的物品重量和价值为:"<<endl;
for(int i=1;i<=n;i++)
i]<<" "<<p[i]<<endl

追问

还是不懂

追答

顺便问一下已知:2x+3y-4=0,求2的X次幂乘于8的Y次幂的值是多少?

C++ error LNK2001: 无法解析的外部符号

#include<algorithm>
#include<vector>
using std::vector;
template<class T> class ProQue
public :
ProQue(T *begin,T *end);
void insert_element(T elem);
T delete_element();
T head();
vector<T> elements;
;
template<class T>
ProQue<T>::ProQue(T *begin,T *end):elements(begin,end)

make_heap(elements.begin(),elements.end());


typedef struct Elem
int num;
Elem;

int main()

Elem elems[] =1,2,3;
ProQue<Elem> fun(elems,&elems[2]); //出错
return 0;

已经可以确定是构造函数的问题,但具体不知道怎么解决,另外,class ProQue 声明与ProQue.h文件中,ProQue类的定义在.cpp文件中,main在另一个main.cpp文件中

参考技术A 我用VS2008编译以上代码时提示出错,不过不是LZ说的问题。

make_heap需要使用到operator<这个运算符,而vector的元素Elem不是基本元素且未重载operator<操作符,make_heap的时候并未提供_Pred。

我的解决方法是让Elem重载操作符operator<,在struct Elem里面加上以下代码段:
bool operator<(const struct Elem& rhs) const

return num < rhs.num;
本回答被提问者采纳
参考技术B 你应该要在main.cpp中include "ProQue.h"
另外看你上面贴的代码中结构体名Elem与变量名也一样,这是会出问题的
typedef struct Elem //结构体名
int num;
Elem; //变量名

你最好把有哪几个文件,每个文件中的具体的程序都给出才好做判断,现在说的不清楚追问

include了,另外Elem那个也是没有问题的,至少不是那个问题

追答

我只是告诉你这个细节就有问题,只是编译的时候如果有大问题的话小问题就不会显示了。即使编译通过了在运行的时候也可能会带来错误,所以还是遵循好的编程规范比较重要。

你在用百度空间吗,你可以把你的每个文件及文件中的内容贴出来,然后把网址放在追问中,这样我也许可以帮你看出问题

参考技术C 把模版 类的声明和定义放在一个文件中,试一试,不放在一个文件中需要特殊处理追问

不行的

以上是关于vs2010 error:1个无法解析的外部命令的主要内容,如果未能解决你的问题,请参考以下文章

关于在vs2010中编译Qt项目时出现“无法解析的外部命令”的错误

error LNK2001: 无法解析的外部符号

vs2010+qt4编译出现error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject等错误

vs2015写c++不是内部或外部命令,也不是可运行的程序或批处理文件

VS2010运行时无法启动程序系统找不到指定文件怎么回事

error LNK2001: 无法解析的外部符号