如何在类中创建模板函数?(C ++)


144

我知道可以做一个模板函数:

template<typename T>
void DoSomeThing(T x){}

并且可以创建一个模板类:

template<typename T>
class Object
{
public:
    int x;
};

但是有可能使一个类不在模板中,然后使该类中的函数成为模板吗?即:

//I have no idea if this is right, this is just how I think it would look
class Object
{
public:
    template<class T>
    void DoX(){}
};

或某种程度上,类不是模板的一部分,但功能是?

Answers:


115

您的猜测是正确的。你要记住的唯一的事情是,成员函数模板定义(除声明外)应在头文件,而不是CPP,虽然它并没有一定要在类声明本身的身体。


3
而且您不能专门化它们。:-(
Frank Krueger

7
不完全正确。定义可以在cpp文件中,只要在定义后从非模板函数/方法中为每个唯一模板参数n-uplet调用一次定义即可。
贝诺瓦

1
因此,我的“应该”-将其保留在标题中是完成此操作的最简单方法。
不确定2009年

4
实际上,我相信您可以明确地专门化它们,但是您不能部分地专门化它们。不幸的是,我不知道这是编译器特定的扩展还是C ++标准。
Patrick Johnmeyer 09年

7
它实际上是标准的c ++。您可以执行struct A {template <typename> void f(); }; 例如template <> void A :: f <int>(){}。您只是不能将它们专用于类范围,但是在命名空间范围内完成时可以做得很好。(不要与专门化的实际范围混淆:专门化仍将是该类的成员-但其定义是在名称空间范围内完成的。通常,放入某些内容的范围与该范围相同一些被定义为-但有时是不正确的,如在超出类定义)所有案件
约翰内斯·绍布- litb

70

请参见此处:模板模板方法,成员模板,成员功能模板

class   Vector
{
  int     array[3];

  template <class TVECTOR2> 
  void  eqAdd(TVECTOR2 v2);
};

template <class TVECTOR2>
void    Vector::eqAdd(TVECTOR2 a2)
{
  for (int i(0); i < 3; ++i) array[i] += a2[i];
}

好的例子。但是为什么template <typename T>在类definitino中...?
Martian2049

@ Martian2049我相信是这样,因此模板仅适用于类中的成员函数,而不适用于整个类。确实是OP所要求的。
CBK

21

是的,模板成员函数是完全合法的,并且在许多场合下都是有用的。

唯一的警告是模板成员函数不能是虚拟的。


9

最简单的方法是将声明和定义放在同一个文件中,但这可能会导致可执行文件过大。例如

class Foo
{
public:
template <typename T> void some_method(T t) {//...}
}

同样,可以将模板定义放在单独的文件中,即,将它们放在.cpp和.h文件中。您需要做的就是将模板实例化明确包含到.cpp文件中。例如

// .h file
class Foo
{
public:
template <typename T> void some_method(T t);
}

// .cpp file
//...
template <typename T> void Foo::some_method(T t) 
{//...}
//...

template void Foo::some_method<int>(int);
template void Foo::some_method<double>(double);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.