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 是一个矢量对象。

文件 2.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 类型成员值的对象

主.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 回答