【问题标题】:Do I need to specify typename in the return type of member function if the function is defined inside the body of the class?如果函数是在类的主体内定义的,我是否需要在成员函数的返回类型中指定 typename?
【发布时间】:2019-10-22 10:16:57
【问题描述】:

考虑下面的例子:

template <typename T>
class SomeClass {
    // rest of the definition ...

    SomeClass<T>& function1() {
        // ...
        return *this;
    }

    SomeClass& function2() {
        // ...
        return *this;
    }

}

上面两个函数的返回值有区别吗?如果不是,应该首选哪一个?

【问题讨论】:

  • 没有区别,通常首选第二个版本,代码重复较少。
  • 附注:即使在类模板定义之外,您也不必使用第一种形式。这是尾随返回类型的一项不错的功能auto SomeClass&lt;T&gt;::function2() -&gt; SomeClass&amp;

标签: c++ templates generic-programming injected-class-name


【解决方案1】:

function1function2 之间没有区别。在SomeClass 的定义中键入SomeClass 而不使用模板参数是使用injected-class-name 的一个实例:

注入的类名是该类范围内的类的名称。

在类模板中,注入的类名既可以用作引用当前模板的模板名,也可以用作引用当前实例化的类名。

是否使用其中一个是主观的,但是注入的类名更易于维护,因为如果您更改SomeClass的模板参数数量,则不必手动更改它。

【讨论】:

  • 我遇到了一些较旧的 GCC 版本的问题,尽管在某些情况下有点错误,让我求助于全名。
猜你喜欢
  • 2014-12-23
  • 2014-08-10
  • 2012-11-06
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多