2017-06-12 4 views
4

私の特別なケースはカスタムイテレータを伴いますが、この質問は一般的なものです。 (すなわち<T>を入れ独自の型を返すテンプレートクラスメソッドの正しい署名

template<typename T> 
struct MyIterator { 

    size_t loc; 

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

2つの他の構成も正常に動作:

template<typename T> 
struct MyIterator { 
    size_t loc; 

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

これはコンパイルが、そうこれを行います。私はこの後置インクリメントメソッドの戻り値の型を作成する方法がわかりませんよMyIteratorのインスタンスの1つのみ)。これを書くには "正しい"方法がありますか?それは問題ですか?

+4

問題ではありません。あなたが見ているのは*注入されたクラス名です* – NathanOliver

答えて

8

「正しい」方法はありますか?

両方の名前が正しい。ただし、注入されたクラス名の使用は、特に複数のテンプレートパラメータがある場合は、より簡単で好ましいです。あなたが持っている想像:クラステンプレート内

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

を、MyClass<T1, T2, T3>よりMyClassを使用することが好ましいです。

重要ですか?

あなたはクラスのスコープ内にあるので、名前の検索は、あなたが期待するものを見つけるでしょう。これは、注入されたクラス名に関係している、と私はあなたがここでそれについての詳細を読むことをお勧め:skypjackが述べたように、Why is there an injected class name?


ので、それを行うには、別の正しい方法は、末尾の戻り値の型を持つautoです。

+3

これを行うための別の_correct_方法は 'auto'で、C++ 14以降の戻り値の型はありません。 – skypjack

+0

@skypjackありがとう、私の答えを改善しました! – gsamaras

関連する問題