使用头文件中定义的向量时,未解决的外部符号错误

时间:2013-06-14 18:17:26

标签: c++ vector header undefined-reference

我是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?给出  但我无法弄清楚如何实现它。

3 个答案:

答案 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。