模板多重定义问题

时间:2016-11-25 18:14:09

标签: c++ templates dll circular-dependency

我想在我的dll项目中使用一些自己的模板类。为了做到这一点,有人建议here我仍然通过包含我的类的头文件的定义(作为.inl文件)将我的类模板声明与其定义分开。我试图完成这个的类是我自己的vector类,它将包装std :: vector类。下面的类设置示例:

Vector.h

#pragma once
#include <vector>

namespace BlazeFramework
{
    template<typename type>
    class Vector
    {
    public:
        Vector();
        Vector(int size);
        ~Vector();

    private:
        std::vector<type> _collectionOfItems;
    };
}

#include "Vector.inl"

Vector.inl

#include "Precompiled.h"
#include "Vector.h"

namespace BlazeFramework
{
    template<typename type>
    Vector<type>::Vector()
    {
    }

    template<typename type>
    Vector<type>::Vector(int size) : _collectionOfItems(_collectionOfItems(size, 0))
    {
    }

    template<typename type>
    Vector<type>::~Vector()
    {
    }
}

当我第一次尝试这个时,我得到的错误是“已经定义了功能模板”。我认为这是由于我的.inl文件包含顶部的“Vector.h”标题所以我删除了它。但是,我现在收到错误,

“无法识别的模板声明/定义”。

如何解决此问题,以便仍然可以将我的类模板定义与其声明分开?

1 个答案:

答案 0 :(得分:1)

将定义和实现模板保存在单独文件中的一种解决方案是在源文件中显式即时化所需的模板。例如:

template class Vector<int>;
template class Vector<float>;

在这种情况下,应删除标题中的#include "Vector.inl"

如果你不喜欢这种方法,你可以坚持#include。但是,请记住Vector.inl文件不应编译为常规源。如果是这样,您将收到redefinition of template...类错误。

尽管如此,请记住,通常模板类最好是紧凑,简单并且设计为保存在头文件中 - 因为这是compieler用来生成实际类的提示。

我建议在以下帖子中阅读有关该主题的内容:

另外,您可能应该查看构造函数中的初始化列表 - 似乎不正确。