首页 文章

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

提问于
浏览
1

我是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 回答

  • 1

    你有abc作为局部变量 . 它应该是一个全局变量 . 只有这样extern才有用 .

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

  • 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

    您将 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 并不好 .

相关问题