C++の落とし穴 このドキュメントは下記URLのサイトを翻訳したものです。 10年以上前に作成されたドキュメントですが、いくつか新たな気づきを与えてくれた原本に感謝して、翻訳してみました。 やや見づらいところもあるかもしれませんが、誰かのお役に立てれば幸いです。 C++ Pitfalls Copyright (C) Cay S. Horstmann 1997 Translated by shnya (unofficial)
何の気なくのぞいてみたら、2chって宝の山なのですね。 過去スレとかにも面白い書き込みがたくさんあり、幾つかがdatに行く前にこうやって張れたらと思います。 91 名前: デフォルトの名無しさん 投稿日: 2007/09/30(日) 20:19:13 クラスの内側で定義したクラステンプレートを特殊化する、 class X { template<typename T> class Y {}; template<> class Y<int> {}; }; のようなコードは、VC++(2003/2005)ではコンパイルできますが、g++3/4では error: explicit specialization in non-namespace scope ‘class X’ というエラー になってしまいます。 YをXの中ではなく、名前空間スコープで template<> class X::Y {}
C++ template の(部分)特殊化ができるとき、できないとき STL はまあ普通に使う、くらいの軟弱な知識で C++ を使っていると、クラス内で関数テンプレートの特殊化をしようとしてコンパイルエラーになって、なんでここで特殊化できないんだよ〜と愚痴を言っていたら、さらに恐ろしいことに、特殊化はできないのに部分特殊化はできる場合に遭遇したりして、 C++ の闇に触れた気分になるのだけど、実はそうでもないという話(少なくとも、ユーザの側から理解するだけなら、ね)。 (部分)特殊化できる条件 ややこしく感じる理由は、特殊化できる条件と、部分特殊化できる条件が全く別だから。実はそんなに複雑ではない。 特殊化できる OK: 名前空間スコープで定義 NG: クラススコープで定義 部分特殊化できる OK: クラステンプレート NG: 関数(⊃メンバ関数)テンプレート 例 template<cla
クラステンプレートは、明示的特殊化できる。クラステンプレートのメンバーは、明示的特殊化できる。このとき、クラステンプレートの明示的特殊化のメンバーの定義と、クラステンプレートのメンバーの明示的特殊化が、似ているのに微妙に違うので、非常にややこしい。 // プライマリークラステンプレート template < typename T > struct X { void f() ; } ; // プライマリークラステンプレートのメンバーの定義 template < typename T > void X<T>::f() { } // クラステンプレートの明示的特殊化 template < > struct X<int> { void f() ; } ; // 上記のクラステンプレートの明示的特殊化のメンバーの定義 // 明示的特殊化ではない // template < >を記述するとエラー vo
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く