类函数的默认模板参数:在哪里指定它?

时间:2012-08-11 00:13:40

标签: c++ templates c++11 default

对于C ++中的每个案例,我必须在哪里指定类成员函数的默认模板参数(假设声明是(当然)在“类体”中,函数定义在类体外) 2011年:

  • “正常”功能
  • 静态功能
  • 朋友的功能

在定义中,在声明中还是两者兼而有之?

2 个答案:

答案 0 :(得分:1)

那么, 根据我创建模板类和方法的经验,您可以指定模板函数:

template<typename T>
T MyFunc(T &aArg1, T &aArg2)
{
    //...Definition Goes Here
}

typename T是模板函数的模板参数类型,您需要将该数据类型一致地传递给标记为“T”的每个参数。这意味着aArg2必须是aArg1所属的任何数据类型。现在,当您调用此函数时,您可以这样调用它: MyFunc</*datatype*/int>(iArg1, iArg2);这两个参数必须是数据类型“int”,否则您将收到警告或错误。

现在,这也适用于类方法(我认为这就是“类成员函数”的意思),它们是类提供的函数(即MyClass::MyFunc())所以当你声明一个类方法时是一种模板方法,您可以采用相同的方式。这是一个示例类:

class MyClass
{
   MyClass();
   ~MyClass();

   template<typename T> 
   static T MyStaticFunc(T aArg) { return aArg; }


   template<typename T> 
   T MyFunc(T aArg) { return aArg; }
}

正如你所看到的,并不困难。现在,静态函数与您必须确定在内置类的同一模块中确定的方式相同,否则,您将收到错误。

不幸的是,我从未真正使用“朋友”方法,所以我不知道如何解决这个问题。我怀疑你会以与其他两个相同的方式做到这一点。我希望答案的整篇文章有所帮助。

答案 1 :(得分:0)

在Clang中尝试这些建议如下:

  • 对于非staticstatic函数,在定义或中指定默认值 声明是可以接受的 - 但不是两者,当然也不是 他们互相矛盾;
  • 对于friend个函数,指定一个 class定义中的默认值会导致错误。