C++ C++;模板显式实例化声明:最佳实践
我的问题是我们应该如何正确地使用模板显式实例化声明 假设我们有一些模板类C++ C++;模板显式实例化声明:最佳实践,c++,c++11,templates,extern,explicit-instantiation,C++,C++11,Templates,Extern,Explicit Instantiation,我的问题是我们应该如何正确地使用模板显式实例化声明 假设我们有一些模板类模板Foo 以下是我如何处理此功能的想法: 我们将模板声明放在Foo.h文件中,实现放在Foo.inl文件中,将这个Foo.inl包含在Foo.h文件的末尾,放置extern模板类Foo
模板Foo
以下是我如何处理此功能的想法:
我们将模板声明放在Foo.h
文件中,实现放在Foo.inl
文件中,将这个Foo.inl
包含在Foo.h
文件的末尾,放置extern模板类Foo在之后加上“Foo.inl”
。此外,我们还应该在例如Foo.cpp
文件中使用显式模板实例化定义(当然,我们还应该在这个cpp文件中包含Foo.h
)
如果我们做了所有这些事情,我们会得到一个错误:我们不能在显式模板实例化声明之后使用显式模板实例化定义。好的,让我们把模板声明和#包含在单独的文件Foo.hpp
中的“Foo.inl”
,并将其包含在Foo.cpp
中。最终我们得到了:
福岛水电站
template<class T>
class Foo
{
public:
Foo();
...
};
#include "Foo.inl"
你不觉得食物太多了吗?你是如何处理的
对不起我的英语
更新:
问题不在于显式模板实例化定义或模板代码本身的配置方法,而在于显式模板实例化声明的使用和“文件地狱”如果我们试图使用它,就会使用它。可能重复.h和.hpp的意义,只需丢弃一个?如果要实例化.cpp文件,则无法将其删除。如果您有适当的文档工具,您可以删除.inl文件,但这可能不是一个好主意。@csiz,在这种情况下,我创建了两个*.h
和*.hpp
文件,因为如果我只留下*.hpp
文件,并将外部模板类Foo
放在里面,我就不能将这个*.hpp
文件包含在*.cpp
文件中。您不能在一个文件中使用显式实例化定义和显式实例化声明(*.cpp
在本例中)嗯,似乎只适用于我@csiz,可能是VS2013的怪癖。这是错误截图
template<class T>
Foo<T>::Foo() {}
#include "Foo.hpp"
extern template class Foo<int>;
#include "Foo.hpp"
template class Foo<int>;
#include "Foo.h"
void bar()
{
Foo f;
}