Exercise 00 学習ノート

関数テンプレートの要点をインタラクティブに学ぶ

1. 関数テンプレートとは? (swap, min, max)

関数テンプレートは、特定の型に依存しない「関数の設計図」です。コンパイラが呼び出し時の引数の型を見て、その型専用の関数を自動的に生成します。これにより、`int`や`std::string`など、様々な型で同じロジックを再利用できます。

template <typename T> void swap(T& a, T& b) { T temp = a; a = b; b = temp; }

やってみよう:`swap`の動作確認

実行ボタンを押して結果を確認

2. スコープ解決演算子 `::` の役割

`::swap(a, b)`のように関数名の前に`::`を付けると、「グローバル名前空間にある関数を呼び出す」という明確な指示になります。これは、`std::swap`のような同名の別の関数との衝突を避けるために重要です。

✅ 安全な呼び出し

// グローバルなswapを明示 ::swap(a, b);

`::` を使うことで、自作したグローバル関数が確実に呼ばれます。

⚠️ 衝突の可能性

using namespace std; // どちらのswapか曖昧 swap(a, b);

もし`std::swap`がより適切な候補と判断されると、意図しない動作に繋がる可能性があります。

3. テンプレートが要求する「暗黙のルール」

テンプレート関数は、内部で使われている操作が可能な型でのみ動作します。クラスで試す場合、必要な「ルール」(演算子など)を実装しなければコンパイルエラーになります。

やってみよう:`Book`クラスでルールを試す

class Book { public: std::string title; int pages; // ... };
試したい操作のボタンを押してください

4. 注意点:ポインタ型 (`char*`) の挙動

`const char*`のようなC言語スタイルの文字列ポインタを`min`/`max`に渡すと、致命的な問題が起こります。文字列の辞書順ではなく、ポインタが指す**メモリアドレスの大小**で比較してしまうため、意図しない結果になります。

やってみよう:`std::string` vs `const char*`

✅ `std::string` (安全)

🚨 `const char*` (危険)

5. コンパイルエラーになる主な原因

テンプレートは、設計図通りにコードを組み立てられない時にコンパイルエラーになります。以下のドロップダウンから、典型的なエラーパターンとその原因を確認してみましょう。

エラー事例を確認する

// エラーになるコード例

🤔 原因

ここにエラーの原因が表示されます。