【问题标题】:Default template argument for functions of classes : where to specify it?类函数的默认模板参数:在哪里指定它?
【发布时间】:2012-08-11 00:13:39
【问题描述】:

在 C++ 中的每种情况下,我必须在哪里指定类成员函数的默认模板参数(假设声明(当然)在“类体”中,而函数定义在类体之外) 2011 年:

  • “正常”功能
  • 静态函数
  • 好友功能

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

【问题讨论】:

  • 你似乎有“定义”和“声明”倒退。类体包含成员函数声明,而它们的定义可以放在外面。
  • 是的,我犯了一个错误。它现在认为它是正确的。
  • 由于必须在声明中为类定义默认模板参数,所以我倾向于将所有默认模板参数放在声明中。 IMO还有部分原型。这同样适用于方法的默认参数。

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


【解决方案1】:

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

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

typename T 是模板函数的模板参数类型,您需要将该数据类型一致地传递给标记为“T”的每个参数。这意味着 aArg2 必须是 aArg1 的任何数据类型。现在,当您调用此函数时,您可以这样调用它: MyFunc&lt;/*datatype*/int&gt;(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; }
}

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

不幸的是,我从来没有真正使用过“朋友”方法,所以我不知道如何解决这个问题。我怀疑您会以与其他两个相同的方式进行操作。我希望整个答案的文章有所帮助。

【讨论】:

  • 您是否错过了有关默认模板参数的问题?如果您用 Google 搜索该短语,您可以了解它们。
【解决方案2】:

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

  • 对于非staticstatic 函数,在定义中指定默认值或 声明是可以接受的——但不能同时接受,如果 它们相互矛盾;
  • 对于friend 函数,指定一个 class 定义中的 default 会导致错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-24
    • 2021-11-01
    • 1970-01-01
    • 2011-06-11
    • 2011-05-25
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多