在非调用的强制转换函数中编译模板中的错误

时间:2017-10-19 12:32:00

标签: c++ templates if-statement inheritance casting

我正在使用另一个使用函数的人员代码  doSomething取决于两个模板:stageT。 我知道他们可以采取各州(MicroDerivedOne)或(MacroDerivedTwo

doSomething我现在需要将DerivedTwo投放到BaseTwoDerivedOne投放到BaseOne。如代码所示,转换只是 当舞台是正确的,即他们总是o.k. 我仍然遇到编译错误,因为无法转换DerivedOneBaseTwo即使从未进行此演员表。

问题: 如何在不更改所涉及的类和模板的一般结构的情况下编译此代码? (这会破坏代码的许多其他部分)。 我最好只想更改doSomething

演员出现在b.c.我需要调用一个可以重载的函数 采取BaseOneBaseTwo。因此,要传递DerivedTwo我需要明确地投射它。

aTest.h

enum  Stage {
    Micro,
    Macro
};

class BaseOne
{
 int a;
};

class BaseTwo
{
int b;
};


class DerivedOne : public  BaseOne
{
 int c;
};

class DerivedTwo: public  BaseTwo, public  BaseOne
{
int d;
};

template  <Stage stage>
class Doer{
    template <class T>
    void doSomething( T t);

};

aTest.cpp

#include "aTest.h"

template< Stage stage >
template < class T >
void Doer<stage>::doSomething(T t) {


 //depending on stage we need to cast t to BaseOne or BaseTwo
 if( stage == Micro )
 {
  overloadedFunction( (BaseOne) t );
 }
 if( stage == Macro )
 {
  overloadedFunction( (BaseTwo) t );
 }



}


template  class Doer<Micro>;
template class Doer<Macro>;


template void Doer<Micro>::doSomething(DerivedOne t);
template void Doer<Macro>::doSomething(DerivedTwo t);

1 个答案:

答案 0 :(得分:1)

您可以使用:

x

现在为什么这会派上用场?

因为现在if语句包含if constexpr (stage == Macro) overloadedFunction( (BaseTwo) t ); ,它将在编译时评估其条件,并且只有在条件求值为true时才会编译它的主体。这意味着身体可能是不正确的,但代码能够编译。阅读更多here