【问题标题】:Correct signature for template class method that returns its own type返回自己的类型的模板类方法的正确签名
【发布时间】:2017-11-14 05:57:21
【问题描述】:

我的特殊情况涉及自定义迭代器,但这个问题是一般问题。我不确定如何为这个后缀递增方法编写返回类型:

template<typename T>
struct MyIterator {
    size_t loc;

    MyIterator operator++(int) {
        MyIterator temp(*this);
        ++loc;
        return temp;
    }
};

这样可以编译,但是这样也可以:

template<typename T>
struct MyIterator {

    size_t loc;

    MyIterator<T> operator++(int) {
        MyIterator<T> temp(*this);
        ++loc;
        return temp;
    }
};

另外两种配置也可以正常工作(即将&lt;T&gt; 仅放在MyIterator 的一个实例上)。有没有“正确”的方式来写这个?有关系吗?

【问题讨论】:

  • 没关系。你看到的是注入的类名

标签: c++ class oop templates operator-overloading


【解决方案1】:

有没有“正确”的写法?

这两个名字都是正确的。但是,使用注入的类名更简单、更可取,尤其是在有多个模板参数的情况下。想象一下你有:

template <typename T1, typename T2, typename T3> class MyClass { ... };

在类模板中,最好使用MyClass而不是MyClass&lt;T1, T2, T3&gt;

重要吗?

没有。

由于您在类的范围内,名称查找将找到您所期望的。这与注入的类名有关,我建议您在此处阅读更多信息:Why is there an injected class name?


由于 ,另一种正确的做法是 auto 没有尾随返回类型,正如 skypjack 提到的那样。

【讨论】:

  • 另一种 正确 方法是 auto,自 C++14 以来没有尾随返回类型。
  • 谢谢@skypjack,改进了我的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多