hoge diary - November 9, 2007

[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 02:12:36 JST 2007