关于c ++:使用头文件中定义的向量时未解决的外部符号错误

Unresolved external symbol error while using vectors defined in a header file

我是C++新手。我在使用向量时有一个未解决的外部符号错误,不知道出了什么问题,所以我把它复制到这里。

我正在使用MS Visual Studio 2011。准确的误差是:

error LNK2001: unresolved external symbol"class std::vector > abc"
(?abc@@3V?$vector@VmyClass@@V?$allocator@VmyClass@@@std@@@std@@A)

我的班级申报表在我的班级里。H:

1
2
3
4
5
6
7
8
9
10
#ifndef __MYCLASS__
#define __MYCLASS__

class myClass{
    public:
        int var;
        myClass(void);
        myClass (int k);
};
#endif

以及my class.cpp中的类定义:

1
2
3
4
5
6
7
8
#include"myClass.h"

myClass::myClass(void){
        var=0;
    }
myClass::myClass (int k){
        var=k;
    }

头:h:

1
2
3
4
5
6
7
8
9
10
11
ifndef __HEADER__
#define __HEADER__

    #include<iostream>
    #include<vector>
    #include"myClass.h"
    using namespace std;

    extern std::vector<myClass> abc;

#endif

MCP.CPP:

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <vector>
#include"myClass.h"
#include"header.h"

using namespace std;

int main(){
    abc.push_back(myClass(5));

    return 1;
}

这就是我得到未解决的外部符号错误的地方。现在我试着把所有这些放在一个单独的文件中,然后编译好了。

以下文件不包含在上述项目中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#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;
}

在什么是未定义的引用/未解析的外部符号错误以及如何修复时给出了解决方案?但我不知道如何实现它。


您没有此矢量的定义:

1
extern std::vector<myClass> abc;

extern声明只告诉编译器对象存在,它是在某个地方定义的。但你在任何地方都没有定义它。

在全局命名空间范围的一个(并且只有一个)中添加此项您的.cpp文件:

1
std::vector<myClass> abc;

实际上,考虑到您没有使用来自不同翻译单元(即.cpp文件)的abc,您根本不需要extern声明。把你的向量放到main.cpp中,因为这是你唯一使用它的地方。

另外,避免使用using指令,尤其是在命名空间范围内(因为它很容易导致与标准库中的实体发生恶意名称冲突):

1
using namespace std; // THIS IS BAD, DON'T DO IT

考虑到您已经限定了std名称空间中实体的名称,因此您实际上不需要上述内容。


您将abc作为局部变量。它应该是一个全局变量。只有这样,extern才能工作。

但是,如果您只想从main()中以局部变量的形式访问它,而不是从另一个编译的cpp文件/对象访问它,那么使用extern是没有意义的。只有当变量是全局变量并且要从另一个编译的cpp/对象访问时,才需要extern。


您声明abcextern,但从未提供定义。

尝试在main.cpp中添加定义:

1
2
3
4
5
6
7
8
9
10
11
12
#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;
}

但是,imho在代码中使用extern似乎是无用的。同时,我认为将头文件命名为header.h是不好的。