【问题标题】:unresolved external symbol when implementing memory management template class [duplicate]实现内存管理模板类时未解析的外部符号[重复]
【发布时间】:2014-02-16 16:38:57
【问题描述】:

我正在尝试创建一个池来管理将很快死亡和重生的小游戏对象的分配等。

为此我创建了一个池:

template <class T>
class Pool {

public:

    T* obtain()
    {
        T* obj = 0;

        if (_avaibles.size() > 0)
        {
            std::vector<T*>::iterator it = _avaibles.begin();
            obj = *it;
            _avaibles.erase(it);
        }
        else
            obj = new T();

        return obj;
    }

    void free(T* obj)
    {
        _avaibles.push_back(obj);
    }

    void clear()
    {
        std::vector<T*>::iterator it = _avaibles.begin();

        while (it != _avaibles.end())
        {
            T act = *it;
            delete act;
            ++it;
        }
    }

private:

    std::vector<T*> _avaibles;

};

问题是我得到了未解析的外部符号。池作为类的静态成员放置:

 static Pool<Ship> _shipPool;

这是错误:

Error   16  error LNK2001: unresolved external symbol "private: 
static class Pool<class Ship> Asdf::_shipPool"  
(?_shipPool@Asdf@@0V?$Pool@VShip@@@@A)  C:\-\Asdf.obj

【问题讨论】:

  • 请提供您收到的错误消息的确切措辞(如果是堆栈/核心转储,我们只需要相关位)。
  • 问题的标题和提出的问题有很大的不同...

标签: c++ visual-studio memory-management pool


【解决方案1】:

您不能像那样拆分模板。将实现放入.hpp 文件中,一切都很好。

请参阅Why can templates only be implemented in the header file? 了解更多信息。

【讨论】:

  • 你是对的。现在给我这个:无法从 Ship** 转换为 Ship*
  • 那是因为你的界面不对。作为练习,在纸上做一次模板实例化,看看你的变量有哪些类型。提示:new T 在您的情况下是 new Ship*。您可能还想前往codereview.stackexchange.com,因为您的实现中存在更多缺陷。
  • @filmor:代码审查仅在代码运行时才起作用。
  • 再次感谢。我修复了这个问题,但现在它无法解析“外部符号私有:静态类 Pool ...”
  • 你修复了什么?您已将整个实现移动到头文件中?请刷新问题或使用您当前的代码发布新问题?
猜你喜欢
  • 2011-08-12
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
  • 2020-03-08
  • 2012-03-11
相关资源
最近更新 更多