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 个无法解析的外部命令<!--<!--
定义错误,这么不包含 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两个数据结构,为何非要做友元函数???
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文件中
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那个也是没有问题的,至少不是那个问题
追答我只是告诉你这个细节就有问题,只是编译的时候如果有大问题的话小问题就不会显示了。即使编译通过了在运行的时候也可能会带来错误,所以还是遵循好的编程规范比较重要。
你在用百度空间吗,你可以把你的每个文件及文件中的内容贴出来,然后把网址放在追问中,这样我也许可以帮你看出问题
不行的
以上是关于vs2010 error:1个无法解析的外部命令的主要内容,如果未能解决你的问题,请参考以下文章
关于在vs2010中编译Qt项目时出现“无法解析的外部命令”的错误
vs2010+qt4编译出现error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject等错误