1

ここに私の問題があります:

コード:

ファイル1.hpp:

namespace Output {

class Stringify{ // base class.....
protected:
    size_t              prec;
public:
    std::stringstream   out;
public:
    Stringify(const size_t& _p = 5): prec(_p) {out.precision(prec);}
    virtual ~Stringify(void){}
public:
    std::string operator()(const XYZ& _v){
        out.str("");
        out << "{ " << _v.x() << ", " << _v.y() << ", " << _v.z() << " }";
        return out.str();
    }
    std::string operator()(const XYZ& _v, const bool& _status){
        out << "{ " << _v.x() << ", " << _v.y() << ", " << _v.z() << " }";
        return out.str();
    }
};
}

ここで、XYZ はベクトル オブジェクトです。

file2.hpp:

namespace NODE { 

class Stringify: public Output::Stringify {
public:
    Stringify2(const size_t& _p = 5): Output::Stringify(_p) {}
    virtual ~Stringify2(void){}
public:
    std::string operator()(const VERTEX& _obj){ return "What?";}
};
}

ここで、VERTEX は XYZ 型のメンバー値を持つ別のオブジェクトです。

main.cpp:

int main(int argc,char * argv[]){
   XYZ  v(1,2,3);
   NODE::Stringify printer;

   cout << printer(v) << endl;
   return 0;

}

出力は次のとおりです。

必要な場合: {1,2,3}

コンパイルは問題ありませんが、私の知る限り、NODE::Stringify は {1,2,3} を出力できます。これは、彼の基本オブジェクトが XYZ 引数のメソッドを継承しているためです。バーテックス(なに?)基本クラスのメソッドを上書きしないため、仮想ワードは必要ありません。

情報として: Eigen 3.0 ライブラリ (typedef Eigen::vector3d XYZ) を使用して llvm-gcc-4.2 を使用して MAC OS 10.8 でコンパイルしています。

前もって感謝します。

4

1 に答える 1

0

operator ()派生クラスのあなたは、基本クラスからオーバーロードを非表示にします(例では名前を付けていますが、コンストラクターとデストラクターの名前が であるため、おそらくタイプミスです)。operator ()Stringify(~)Stringify2

usingこれは、派生クラス内で宣言することで修正できます。

namespace NODE {
    class Stringify2 : public Output::Stringify {
    //             ^
    public:
        using Output::Stringify::operator ();
    //  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    //  This should fix the problem

        Stringify2(const size_t& _p = 5): Output::Stringify(_p) {}
        virtual ~Stringify2(void){}
    public:
        std::string operator()(const VERTEX& _obj){ return "What?";}
    };
}
于 2013-03-20T18:30:10.113 に答える