我是C的新手 . 使用向量时我有一个未解决的外部符号错误,并且不知道出了什么问题,所以我在这里复制了它 .
我正在使用MS Visual Studio 2011.确切的错误是:
错误LNK2001:未解析的外部符号“class std :: vector> abc”(?abc @@ 3V?$ vector @ VmyClass @@ V?$ allocator @ VmyClass @@@ std @@@ std @@ A)
我在 myClass.h 有我的 class 声明:
#ifndef __MYCLASS__
#define __MYCLASS__
class myClass{
public:
int var;
myClass(void);
myClass (int k);
};
#endif
和 myClass.cpp 中的我的类定义:
#include"myClass.h"
myClass::myClass(void){
var=0;
}
myClass::myClass (int k){
var=k;
}
header.h :
ifndef __HEADER__
#define __HEADER__
#include<iostream>
#include<vector>
#include"myClass.h"
using namespace std;
extern std::vector<myClass> abc;
#endif
main.cpp :
#include <iostream>
#include <vector>
#include "myClass.h"
#include "header.h"
using namespace std;
int main(){
abc.push_back(myClass(5));
return 1;
}
这是我得到未解决的外部符号错误的地方 . 现在我尝试将所有这些放在一个文件中,它编译得很好 .
THE FOLLOWING FILE IS NOT INCLUDED IN THE ABOVE PROJECT.
#include<iostream>
#include<vector>
#include"myClass.h"
using namespace std;
class myClass{
public:
int var;
myClass(void){
var=0;
}
myClass (int k){
var=k;
}
};
int main(){
std::vector<myClass> abc;
abc.push_back(myClass(5));
return 1;
}
该解决方案已在What is an undefined reference/unresolved external symbol error and how do I fix it?给出,但我无法弄清楚如何实现它 .
3 回答
你有abc作为局部变量 . 它应该是一个全局变量 . 只有这样extern才有用 .
但是,如果您只想从main()内部访问它作为局部变量而不是从另一个编译的CPP文件/对象访问它,那么使用extern是没有意义的 . 仅当变量是全局变量并且从另一个已编译的CPP /对象访问时才需要extern .
您没有此向量的定义:
extern
声明仅告诉编译器该对象存在且在某处定义 . 但是你没有在任何地方定义它 .在全局命名空间范围内将其添加到
.cpp
文件的一个(并且只有一个!)中:实际上,考虑到您不使用来自不同翻译单元的
abc
(即.cpp
文件),您根本不需要extern
声明 . 只需将矢量放在main.cpp
中,因为这是您使用它的唯一地方 .另外,请避免
using
指令,尤其是在命名空间范围内(因为它很容易导致与标准库中的实体发生令人讨厌的名称冲突):考虑到您已经在
std
命名空间中限定了实体的名称,您实际上并不需要上述内容 .您将
abc
声明为extern
但您从未提供过它的定义 .尝试在
main.cpp
中添加定义:但是,在你的代码中使用extern这里的恕我直言似乎没用 . 同时,我认为将头文件命名为
header.h
并不好 .