我是C ++的新手。我在使用向量时遇到了一个未解决的外部符号错误,并且不知道出了什么问题所以我在这里复制了它。
我正在使用MS Visual Studio 2011.确切的错误是:
错误LNK2001:未解析的外部符号“class std :: vector> abc” (?ABC @@ 3V?$矢量@ @@ VmyClass V'$分配器@ VmyClass @@@ STD @@@ STD @@ A)
我在 myClass.h :
中有我的班级声明#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;
}
这是我得到未解决的外部符号错误的地方。现在我尝试将所有这些放在一个文件中并且编译好了。
上述项目中未包含以下文件。
#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?给出 但我无法弄清楚如何实现它。
答案 0 :(得分:3)
此向量没有定义:
extern std::vector<myClass> abc;
extern
声明只告诉编译器该对象存在且在某处定义。但是你没有在任何地方定义它。
在全局命名空间范围内添加此.cpp
个文件中的一个(且只有一个!):
std::vector<myClass> abc;
实际上,考虑到您没有使用来自不同翻译单元的abc
(即.cpp
文件),您根本不需要extern
声明。只需将您的矢量放在main.cpp
中,因为这是您使用它的唯一地方。
此外,避免使用using
指令,尤其是在命名空间范围内(因为它很容易导致与标准库中的实体发生令人讨厌的名称冲突):
using namespace std; // THIS IS BAD, DON'T DO IT
考虑到您已经从std
命名空间中对实体的名称进行了限定,您实际上并不需要上述内容。
答案 1 :(得分:1)
您将abc
声明为extern
,但您从未为其提供过定义。
尝试在main.cpp
中添加定义:
#include <iostream>
#include <vector>
#include "myClass.h"
#include "header.h"
using namespace std;
std::vector<myClass> abc; //^^add this line
int main(){
abc.push_back(myClass(5));
return 1;
}
然而,在你的代码中使用extern的恕我直言似乎没用。同时,我认为将头文件命名为header.h
并不好。
答案 2 :(得分:1)
你有abc作为局部变量。它应该是一个全局变量。只有这样才能有效。
但是如果你只想从main()中的本地变量而不是从另一个编译的CPP文件/对象访问它,那么使用extern是没有意义的。只有当变量是全局变量并且从另一个已编译的CPP /对象访问时才需要extern。