タグ

2011年6月2日のブックマーク (2件)

  • メンバ関数の部分特殊化がしたい - akihiko’s tech note

    C++ でメンバ関数を部分特殊化しようとすると(例えばテンプレートクラスのテンプレートメンバ関数を,ある特定の型について特殊化する),コンパイルエラーとなる.gcc なら "error: invalid use of incomplete type" だとか, "error: enclosing class templates are not explicitly specialized" などのエラーが発生する.しかし,現実には,部分特殊化したいことも多い.そこで,やや強引な解決策を実装してみた. 問題提起 template <typename T1, typename T2> struct TTest { T1 ex() { ... } }; template <> void TTest<void, void>::ex() // OK { ... } これは,メンバ関数 TTest::

    メンバ関数の部分特殊化がしたい - akihiko’s tech note
    mae0510
    mae0510 2011/06/02
  • C++ template の特殊化/部分特殊化が可能な条件

    STL はまあ普通に使う、くらいの軟弱な知識で C++ を使っていると、クラス内で関数テンプレートの特殊化をしようとしてコンパイルエラーになって、なんでここで特殊化できないんだよ〜と愚痴を言っていたら、さらに恐ろしいことに、特殊化はできないのに部分特殊化はできる場合に遭遇したりして、 C++ の闇に触れた気分になる。でも実はそうでもないという話(少なくとも、ユーザの側から理解するだけなら、ね)。 2025-02-16: この記事は C++03 時代に書かれたものですが、 C++23 でもここで解説している仕様に大きな変更はないはずです。 (部分)特殊化できる条件 ややこしく感じる理由は、特殊化できる条件と、部分特殊化できる条件が全く別だから。実はそんなに複雑ではない。 特殊化できる OK: 名前空間スコープで定義 NG: クラススコープで定義 部分特殊化できる OK: クラステンプレート

    mae0510
    mae0510 2011/06/02