C ++ - 我可以使用未在头文件中实现的模板函数吗?

时间:2012-07-26 20:07:08

标签: c++ templates

  

可能重复:
  Storing C++ template function definitions in a .CPP file
  Why can templates only be implemented in the header file?
  Why should the implementation and the declaration of a template class be in the same header file?

我有三个文件。在一个base.h中,我有一个使用模板成员的类:

class Base {
    protected:
        template <class T>
            void doStuff(T a, int b);
};

在base.cpp中,我实现了Base :: doStuff():

#include "base.h"

template <class T>
void Base::doStuff(T a, int b) {
    a = b;
}

然后我尝试在我的项目中的另一个类中使用它:

#include "base.h"

void Derived::doOtherStuff() {
    int c;
    doStuff(3, c);
}

但是我收到一个链接错误,指出它找不到'doStuff(int,int)'

从我所看到的情况来看,如果不将此函数的实现移动到头文件中,这在C ++ 03中是不可能的。有干净的方法吗? (我使用C ++ 11x功能很好。)

1 个答案:

答案 0 :(得分:4)

将模板定义与内联函数定义一起放入.inl文件并将其包含在.h文件的末尾是一种常见的习惯用法:

base.h

#ifndef BASE_H
#define BASE_H

class Base {
    protected:
        template <typename T>
        void doStuff(T a, int b);
};

#include "base.inl"

#endif

base.inl

template <typename T>
void Base::doStuff(T a, int b) {
    a = b;
}