单独.cpp文件中的模板类专用化

Template class specialization in seperate .cpp file

本文关键字:专用 cpp 文件 单独      更新时间:2024-05-10

我在foo.h中有以下模板类专业化:

using VisionMethod = enum
{
TemplateMatching,
...
};
template <VisionMethod>
class Foo
{
Foo() = delete;
};
template <>
class Foo<TemplateMatching>
{
public:
static void get_pose();
};

并希望在CCD_ 2中实现为:

#include "foo.h"
void
Foo<TemplateMatching>::get_pose()
{
std::cout << "Using foo<TemplateMatching>::get_pose()...n";
}

但是,当我试图在例如main.cpp中仅包含foo.h之后调用foo<TemplateMatching>::get_pose()时,我(在某种程度上可以理解(遇到了链接器错误。我可以实现我想要的吗,而不必在foo.hmain.cpp中包含foo.cpp——也许可以使用显式实例化?或者像foo.txx这样的东西是我唯一的";"干净";解决方案

您提出的建议已经有效(在添加#include <iostream>之后(,您可能忘记告诉编译器包含foo.cpp

g++ main.cpp foo.cpp

https://wandbox.org/permlink/LDpxhgeYPkakWFwE

为了在main.cpp中使用它,您需要在foo.h中定义您的专用函数(即您在foo.cpp中放入的函数(

据我所知,这是无法逃脱的规则。但是,如果您想将头文件和实现分开以使项目更干净,一个非常常见的解决方案是将实现放在一个单独的文件中(我通常将其扩展名为.inl(,并将其包含在头文件的末尾。这样,从人类的角度来看,它看起来像是头/impl分离,但编译器仍然可以在其头文件中包含所有内容。此文件不是编译目标,因此不必为其提供.cpp扩展名。