在CPP文件中实现非模板类的模板成员

Implement template member of non-template class in cpp file

本文关键字:成员 CPP 文件 实现      更新时间:2023-10-16

我有一个类:

// A.h
class A
{
    void foo();
    template <class T> void bar( T someVar );
}
#include "A.tcpp"

当我构建它时,会收到链接器错误。但是,如果整个类都是模板,那么上面的示例将完全构建。所以我的问题是:

当具有模板成员函数而不是拥有模板类时,我如何坚持使用CPP文件中所有定义的模式?

如果要将具有模板函数的类和非模板函数拆分为标头文件和TCPP文件,则只需将模板定义放在TCPP文件中。非模板定义仍然需要进入常规CPP文件。

将非模板代码放在TCPP文件中包含它回到标题文件中,然后意味着它在包含在其中的每个翻译单元中定义。

在这种情况下,这意味着您应该拥有

// A.h
class A
{
    void foo();
    template <class T> void bar( T someVar );
}
#include "A.tcpp"
// A.tcpp
template <class T> void A::bar( T someVar ) { some code; }
// A.cpp
#include "A.h"
void A::foo() { some code; }

我找到了解决方案,它并不像我想要的那样好,但是在我的情况下它会做到。我们可以在TCPP文件的末尾插入以下行:

template void A::bar<int>( int );
// And so on, for all types that should be supported.

它称为函数模板实例。