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. コンパイルエラーになる主な原因
テンプレートは、設計図通りにコードを組み立てられない時にコンパイルエラーになります。以下のドロップダウンから、典型的なエラーパターンとその原因を確認してみましょう。
エラー事例を確認する
// エラーになるコード例
🤔 原因
ここにエラーの原因が表示されます。