模板多重定义问题
Template multiple definition issue
我想在我的 dll 项目中使用一些我自己的模板 classes。为了做到这一点,有人建议 here 我仍然将我的 class 模板声明与其定义分开,方法是包括我的 class 的 header 文件的定义(作为.inl 文件)。 class 我试图用我自己的矢量 class 来实现这一点,它只会包装 std::vector class。下面的 class 设置示例:
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()
{
}
}
当我第一次尝试这个时,我得到了 "Function Template has already been defined" 的错误。我认为这是由于我的 .inl 文件在顶部包含 "Vector.h" header,所以我删除了它。但是,我现在遇到了错误,
"unrecognizable template declaration/definition"。
如何解决这个问题,以便我仍然可以将我的 class 模板定义与其声明分开?
将定义和实现模板保存在单独文件中的一种解决方案是在源文件中显式实例化所需的模板。例如:
template class Vector<int>;
template class Vector<float>;
在这种情况下,header 中的 #include "Vector.inl"
应该被删除。
如果您不喜欢这种方法,可以坚持使用 #include
。但是,请记住 Vector.inl
文件不应编译为常规源代码。如果是这样,您将收到 redefinition of template...
类错误。
尽管如此,请记住,一般来说,模板 类 最好是紧凑、简单的,并且设计为保存在 header 文件中 - 因为这是编译器用来生成的提示实际 类.
我建议阅读以下帖子中的主题:
- Splitting templated C++ classes into .hpp/.cpp files--is it possible? - 关于编译器如何相对于模板化工作的一个很好的评论 classes/functions
- Why can templates only be implemented in the header file? - 另一种解释问题的方法(带有代码示例)
- IsoCpp FAQ - Templates - 关于模板的大量有用信息
此外,您可能应该查看构造函数中的初始化列表 - 似乎不正确。
我想在我的 dll 项目中使用一些我自己的模板 classes。为了做到这一点,有人建议 here 我仍然将我的 class 模板声明与其定义分开,方法是包括我的 class 的 header 文件的定义(作为.inl 文件)。 class 我试图用我自己的矢量 class 来实现这一点,它只会包装 std::vector class。下面的 class 设置示例:
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()
{
}
}
当我第一次尝试这个时,我得到了 "Function Template has already been defined" 的错误。我认为这是由于我的 .inl 文件在顶部包含 "Vector.h" header,所以我删除了它。但是,我现在遇到了错误,
"unrecognizable template declaration/definition"。
如何解决这个问题,以便我仍然可以将我的 class 模板定义与其声明分开?
将定义和实现模板保存在单独文件中的一种解决方案是在源文件中显式实例化所需的模板。例如:
template class Vector<int>;
template class Vector<float>;
在这种情况下,header 中的 #include "Vector.inl"
应该被删除。
如果您不喜欢这种方法,可以坚持使用 #include
。但是,请记住 Vector.inl
文件不应编译为常规源代码。如果是这样,您将收到 redefinition of template...
类错误。
尽管如此,请记住,一般来说,模板 类 最好是紧凑、简单的,并且设计为保存在 header 文件中 - 因为这是编译器用来生成的提示实际 类.
我建议阅读以下帖子中的主题:
- Splitting templated C++ classes into .hpp/.cpp files--is it possible? - 关于编译器如何相对于模板化工作的一个很好的评论 classes/functions
- Why can templates only be implemented in the header file? - 另一种解释问题的方法(带有代码示例)
- IsoCpp FAQ - Templates - 关于模板的大量有用信息
此外,您可能应该查看构造函数中的初始化列表 - 似乎不正确。