【问题标题】:Template multiple definition issue模板多定义问题
【发布时间】:2017-04-10 04:21:30
【问题描述】:

我想在我的 dll 项目中使用我自己的一些模板类。为了做到这一点,建议here 我仍然通过包含我的类头文件的定义(作为.inl 文件)将我的类模板声明与其定义分开。我尝试使用的类是我自己的向量类,它只包装 std::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”标题,所以我删除了它。但是,我现在遇到了错误,

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

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

【问题讨论】:

  • 不要在 *.inl 文件中包含任何内容。

标签: c++ templates dll circular-dependency


【解决方案1】:

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

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

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

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

不过,请记住,一般来说,模板类最好是紧凑、简单并设计为保存在头文件中 - 因为这是编译器用来生成实际类的提示。

我建议阅读以下帖子中的主题:

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

【讨论】:

  • 感谢您的链接!是的,我很快就做到了。不是 100% 确定应该如何使用 std::vector 设置我的类的构造函数。
  • 您可以简单地写:_collectionOfItems(size, 0) - 而不是嵌套成员
猜你喜欢
  • 2013-08-27
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
相关资源
最近更新 更多