Container はテンプレート引数であり、型名です。
型といっても、ここでは int や double のような型ではなく、
vector<int> や list<double> のようなクラス型であることを仮定しています。
クラスの内部には、メンバ関数やメンバ変数以外にメンバ型があります。
vectorクラスは、template<typename T> class vector { ... };
と定義されて
いるテンプレートクラスで、size や begin といったメンバ関数を持っています。
さらに T という型を外部から参照するために value_type というメンバ型を持っています。
vectorクラスの定義の中で using value_type = T;
と宣言されているはずです。
メンバ関数は、オブジェクト名.size
のようにして参照しますが、
メンバ型は、クラス名::value_type
のようにして参照します。
Container が vector<int> のとき、Container::value_type は int です。
ただ、Container::value_type と書いただけでは、
それがメンバ関数なのかメンバ変数なのかメンバ型なのか分かりません。
そこで typename Container::value_type と書くのです。
追記
質問のコードは本当に教材のコードそのままなんでしょうか?
back_inserter はクラステンプレートなのに、<> を付けない
auto out = back_inserter(temp) ;
はエラーになりませんか?
copy の第3引数は output_iterator の要件を満たしていなければいけないのに
back_inserterクラスには *演算子も、++演算子も定義されていません。
標準ライブラリの back_inserter はクラスではなく関数テンプレートであり、
その関数は back_inserter_iteratorクラスのオブジェクトを返します。
次のように書かないと正しく動かないのではありませんか?
C++
1#include <iostream>
2#include <vector>
3
4template <typename Container>
5struct back_inserter_iterator {
6 using container_type = Container;
7 using value_type = void;
8 using pointer = void;
9 using reference = void;
10 using difference_type = void;
11 using iterator_category = std::output_iterator_tag;
12
13 back_inserter_iterator(Container& c) : c(c) { }
14
15 back_inserter_iterator& operator=(const typename Container::value_type & value) {
16 c.push_back(value);
17 return *this;
18 }
19 back_inserter_iterator& operator*() { return *this; }
20 back_inserter_iterator& operator++() { return *this; }
21 back_inserter_iterator& operator++(int) { return *this; }
22
23 Container& c;
24};
25
26template <typename Container>
27back_inserter_iterator<Container> back_inserter(const Container& c) {
28 return back_inserter_iterator<Container>(c); // クラステンプレートには <> が必要。
29}
30
31template <typename Container>
32void f(const Container& c) {
33 std::vector<typename Container::value_type> temp;
34 auto out = back_inserter(temp); // 関数テンプレートの呼び出しは <> がなくてもよい
35 std::copy(std::begin(c), std::end(c), out);
36
37 for (auto e : temp) std::cout << e << std::endl;
38}
39
40int main() {
41 std::vector<int> a = { 3, 1, 4, 2 };
42 f(a);
43}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/02/18 03:53