2017-06-12 91 views
4

我的特例涉及到一个自定义迭代器,但这个问题是一个普遍问题。我不确定如何写这个后缀增量方法的返回类型:模板类方法的正确签名返回它自己的类型

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; 
    } 
}; 

两个其他配置也正常工作(即把<T>仅在MyIterator的一个实例上)。有没有“正确”的方式来写这个?有关系吗?

+4

没关系。你看到的是*注入的类名* – NathanOliver

回答

8

有没有一种“正确”的方式来写这个?

这两个名字都是正确的。但是,使用注入的类名称更简单且更可取,特别是如果有多个模板参数。想象一下,你有:

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

在类模板,最好使用MyClassMyClass<T1, T2, T3>

重要吗?

你既然是类的范围内,名称查找会发现你所期望的。这与注入的类名做的,我建议你在这里阅读更多关于它:Why is there an injected class name?


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

+3

另一个_correct_的方法是'自动',自C++ 14以来没有尾随返回类型。 – skypjack

+0

谢谢@skypjack,改进了我的答案! – gsamaras