首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何解决“对‘`vtable for <<ClassName>>’的未定义引用”错误?

如何解决“对‘`vtable for <<ClassName>>’的未定义引用”错误?
EN

Stack Overflow用户
提问于 2015-04-24 23:35:46
回答 1查看 2.1K关注 0票数 2

我是C++初学者。我有一个singleton 'Manager‘类,如下所示,在Eclipse中构建该项目时会出现以下错误:

../src/Manager.hpp:28: undefined reference to 'vtable for Manager'

下面的代码是在dev环境或IDE中运行的最小(几乎)代码,如果您想要重现错误的话。

Manager.hpp

代码语言:javascript
运行
复制
#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <unistd.h>

#include "stream_state.h"


class Manager {
    public:
       static Manager* getInstance();
       std::vector<stream_state> m_stateList;      // Why can I not remove std::?

       virtual ~Manager();      // Virtual destructor

    private:
       Manager(){};                               // ERROR points here - why so?
       Manager(Manager const&){};
       static Manager* pSingleton;
};

Manager.cpp

代码语言:javascript
运行
复制
#include "Manager.hpp"

Manager* Manager::pSingleton = 0;

Manager* Manager::getInstance()
{
    if (pSingleton == NULL){
        pSingleton = new Manager;
    }
    return pSingleton;
}

// Other member function implementations

main.cpp

代码语言:javascript
运行
复制
#include <iostream>
#include <stdlib.h>
#include "Manager.hpp"

int main(int argc, char** argv)
{

    Manager* managerObj;
    managerObj = Manager::getInstance();
    // some other code
    return 0;
}

stream_state.h

代码语言:javascript
运行
复制
struct stream_state
{
   FILE* sp;
   bool locked;
};

我已经尝试过的(但没有成功):

  1. 我将Manager类的构造函数更改为: Manager::Manager(){};错误:extra qualification 'Manager::' on member 'Manager'
  2. 我从行std::中删除了std::vector<stream_state> m_stateList; vector<stream_state> m_stateList;错误:vector does not name a type

请有人解释一下undefined reference to 'vtable for Manager'错误(如果可能,但没有必要,请解释vector does not name a type error)好吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-24 23:37:50

我看到了~Manager()的声明,但没有看到定义。这需要在Manager.cpp中。

我相信您收到了这条晦涩的消息,因为vtable保存着所有虚拟函数的地址。您只有一个虚拟函数,而且还没有定义它。

我无法重现vector错误。一旦我将~Manager::Manager() { }添加到Manager.cpp中,我的版本就会编译得很好。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29859223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档