«前の日記(2010年03月12日) 最新 次の日記(2010年03月16日)» 編集

日々をアレコレ


2010年03月14日

クラスのオペレータはクラス内に定義

とあるオープンソースのソフトを違うコンパイラでビルドしていた時には発生した問題。あるクラスとそのオペレータをとあるソース内で次のように定義していた。

/* hoge.cpp */
class CHoge {
public:
    int myVal;
    CHoge(): myVal(0) { }
};

static inline int operator(CHoga a, CHoge b)
    { return a.myVal == b.myVal; }

これをコンパイルするとhoge.cpp内でCHogeオブジェクトの比較をしている箇所はエラーが発生しない。しかし、テンプレートクラスに対してCHogeを渡すと、そのテンプレート内で仮想型オブジェクトの比較をしている箇所で対応するオペレータがないというコンパイルエラーが発生。異なるコンパイラを使うことを考慮するなら、オペレータはクラスの定義内に書くのがいいようだ。

class CHoge {
public:
    int myVal;
    CHoge(): myVal(0) { }
    int operator==(CHoge a)
        { return myVal == a.myVal; }
};

もっというと、このままでは別の問題が発生する。constなオブジェクトを含む比較をすると、やはり対応するオペレータがないというコンパイルエラーが発生する。なので、オペレータは次のように書くのがいいみたい。

int operator==(const CHoge a) const
    { return myVal == a.myVal; }

引数のconstが演算子の右側、引数リストの後のconstが演算子の左側に対応するようだ。


«前の日記(2010年03月12日) 最新 次の日記(2010年03月16日)» 編集