hoge diary - November 9, 2007

[映画] Today's Movie

今日は「ボーン・スプレマシー」(英題: The Bourne Surpremacy) です.これも例によって明日公開の「ボーン・アルティメイタム」に関連しての放送で,映画館でスプレマシーを見てなかったので観ることに.ちなみに,supremacy とは英語で「優位」「支配」とのこと.

例によってあらすじは,調べると出ますのでここには書きません.

ストーリーが進んでいくパターンは前作と同じ感じで,ボーンが追われるのがメイン.でも今作は前作より追われ方が激しい.

で,観終えた感想はと言いますと,なかなか面白い映画でした.ただ,派手なアクション映画が好みの自分にとってはボーンの活躍が地味に見えて,ちょーっと物足りない感じ.

以下余談.

序盤の舞台はベルリンなので,ボーンを追う警官が走りながら「POLIZEI!!, POLIZEI!!」と連呼してます.それ以外の台詞はなし.

えーと... 観客に対する分かりやすさへの配慮なのか,はたまたドイツの警察がそういうものなのか... は不明ですが,せめて「待てー」とか「止まれー」とかドイツ語で喋って欲しかった.

コメント

名前(何でも可):

テキスト(http:// を含む内容は投稿できません):

トラックバック

トラックバック URI: https://www.pakunet.jp/hoge/trackback/2007110902

トラックバックはありません.

[C++] VC2005 とテンプレートと friend

テンプレートクラスの中で関数に対する friend 宣言とその関数の定義を書くと... VC2006 のコンパイラはそれぞれを別物として扱い,結果,呼び出し時に「あいまいである」と C2593 エラーを出してくれます.

今回コンパイルしようとしたのは下のコード.テンプレートクラス Hoge の中で,テンプレート関数を friend 宣言して,クラスの外にその関数の定義を書いたものです.

#include <iostream>

namespace N {

template <size_t A, size_t B>
class Hoge
{
public:
  template <size_t A_, size_t B_>
  friend inline Hoge<A_,B_> operator * ( const Hoge<A_,B_>& a, const Hoge<A_,B_>& h );
};

template <size_t A, size_t B>
inline Hoge<A,B> operator * ( const Hoge<A,B>& a, const Hoge<A,B>& h )
{
  return Hoge<A,B>();
}

}

int main()
{
  N::Hoge<3,4> a;
  N::Hoge<3,4> b;
  N::Hoge<3,4> c = a*b;
  return 0;
}

これを VC2005 Express SP1 のコンパイラ (cl.exe 14.00.50727.762) でコンパイルすると... C2593 エラーが発生します.

$ cl /EHsc /Ox /MD /Oy /GF /Zc:wchar_t /Zc:forScope /nologo /c /Fo"test.obj" "test.cc"
test.cc
test.cc(44) : error C2593: 'operator *' があいまいです。
        test.cc(12): 'N::Hoge<A,B> N::operator *<3,4>(const N::Hoge<A,B> &,const N::Hoge<A,B> &)' [引数依存の照合を使用して検出しました] 、
        with
        [
            A=3,
            B=4
        ]
        test.cc(22): または 'N::Hoge<A,B> N::operator *<3,4>(const N::Hoge<A,B> &,const N::Hoge<A,B> &)' [引数依存の照合を使用して検出し ました] の可能性があります
        with
        [
            A=3,
            B=4
        ]
        引数リスト '(N::Hoge<A,B>, N::Hoge<A,B>)' を一致させようとしているとき
        with
        [
            A=3,
            B=4
        ]
$

ここでコンパイラが曖昧だと言っている 2 つの関数,よく見るとシグネチャが同じです.

  • test.cc(12): 'N::Hoge<3,4> N::operator *<3,4>(const N::Hoge<3,4> &,const N::Hoge<3,4> &)'
  • test.cc(22): 'N::Hoge<3,4> N::operator *<3,4>(const N::Hoge<3,4> &,const N::Hoge<3,4> &)'

VC2005 SP1 のコンパイラはこの 2 つを別物だと扱ってしまっているようです.g++ 3.4.4 では問題なくコンパイルできました.

調べてみると,同じ内容のフィードバックを発見.が,しかし,このフィードバックの状態と書かれた項目を見ると,終了 (修正しない)となっており,VC2005 (SP1 含む) では直さないようです.

これは困った.VC2008 では直ってるのかな.

コメント

名前(何でも可):

テキスト(http:// を含む内容は投稿できません):

トラックバック

トラックバック URI: https://www.pakunet.jp/hoge/trackback/2007110901

トラックバックはありません.


Valid XHTML 1.1! Valid CSS!
© 2004-2009 ぱくちゃん.
Last modified: Fri Nov 09 23:06:58 JST 2007