在cpp文件

时间:2018-02-21 18:36:51

标签: c++ templates

我有一个班级:

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

#include "A.tcpp"

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

如果有模板成员函数而不是模板类,我如何坚持cpp文件中所有定义的模式?

2 个答案:

答案 0 :(得分:2)

如果要将具有模板函数和非模板函数的类拆分为头文件和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; }

答案 1 :(得分:0)

我找到了解决方案,它不如我想的那么好,但它会在我的情况下做。我们可以在tcpp文件的末尾插入以下行:

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

它被称为function template instantiation