2

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

我正在使用 MS Visual Studio 2011。确切的错误是:

错误 LNK2001:未解析的外部符号“类 std::vector > abc”(?abc@@3V?$vector@VmyClass@@V?$allocator@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;
    }

标头.h

ifndef __HEADER__
#define __HEADER__

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

    extern std::vector<myClass> abc;

#endif

主.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;
}

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

4

3 回答 3

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,您实际上并不需要上述内容。

于 2013-06-14T18:19:45.537 回答
2

您声明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.

于 2013-06-14T18:21:00.067 回答
1

您将 abc 作为局部变量。它应该是一个全局变量。只有这样 extern 才会起作用。

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

于 2013-06-14T18:21:48.637 回答