Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板显式实例化声明:最佳实践_C++_C++11_Templates_Extern_Explicit Instantiation - Fatal编程技术网

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;
}