1

我觉得我的问题很简单而明确:如何正确地从基类的重载转换继承

我有基类AbstractMatrix,和Matrix它的子类,我想使简单的换算:

namespace mtrx { 
/* mycode */ 
    class AbstractMatrix { 
     public: 
     /* -//- */ 
     operator Matrix(); 
     /* -//- */ 
    } 
    class Matrix : public AbstractMatrix { 
    /* -//- */ 
    } 
} 

AbstractMatrix.cpp:

AbstractMatrix::operator Matrix(){ 
    return Matrix(data); 
} 

编译器为消息:

Matrix.h:39:12: error: expected type-specifier before ‘Matrix’ 
    operator Matrix(); 
      ^

我做错了什么? 是否有可能进行此类转换?我想是的,因为我只想让基于超,但没有任何枯燥的语法构造,我需要它隐含

谢谢

+0

我更好奇你为什么需要这样做?运营商应该解决什么问题?你不能有一个虚拟的“getter”函数返回一个'AbstractMatrix'指针吗?或者可能使用[CRTP](https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern)来了解子类? –

+2

至于你的问题,你*确实知道符号必须在使用符号之前声明(或者有时甚至定义)*例如foo(矩阵A)的 –

+0

;如果我做这样的foo(B),其中B是AbstractMatrix,则B将被转换为Matrix类。感谢您的建议,我最近开始学习C++,我会阅读关于虚拟功能和CRTP,可能会帮助我。 – verganz

回答

5

您应该简单地提供一个向前声明

namespace mtrx { 

    class Matrix; // <=== here 

    class AbstractMatrix { 
     public: 
     operator Matrix(); 
    }; 

    class Matrix : public AbstractMatrix { 

    }; 

} 

使Matrix可见AbstractMatrix类。


P.S.你应该重新考虑你的设计,因为有一个转换操作符将基类转换为派生类对我来说看起来很奇怪。

+0

哦,我试图在命名空间上面执行它。关于设计是的,我认为你的评论是适当的,但更多的是好奇它为什么不起作用 – verganz