如何解决“对于&lt; <classname>&gt;的vtable的未定义引用”错误?

时间:2015-04-24 23:35:47

标签: c++ c++11 vector constructor vtable

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

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

[以下代码是您在开发环境或IDE中运行的最低(几乎),如果您想尝试重现错误。]

Manager.hpp

#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

#include "Manager.hpp"

Manager* Manager::pSingleton = 0;

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

// Other member function implementations

的main.cpp

#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

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)?

1 个答案:

答案 0 :(得分:3)

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

我相信你收到这条晦涩的消息,因为vtable包含所有虚函数的地址。您只有一个虚拟功能,但尚未定义它。

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