也许显式类型转换会产生C ++编译错误

时间:2019-03-24 14:26:45

标签: c++

在这种情况下,我不知道真正的问题,但我想这是类型转换的问题(如我所见,这是显式类型转换或隐式类型转换)。

这里是产生编译错误的代码示例。

class Vector
{
public:
   Vector(double x, double y) : x_(x), y_(y){}

private:
   double x_, y_;
};        

class Operation
{
public:
   class ConcreteOp
   {
   public:
      ConcreteOp(const Vector& v) : v_(v){}

   private:
      Vector v_;
   };

   Operation(const ConcreteOp& op) : op_(op){}

private:
   ConcreteOp op_;   
};        

class Method
{
public:
   Method(const Operation& op) : op_(op){}

private:
   Operation op_;
};        

void test(const Method& m)
{
}

int main()
{
   Vector v(2, 2);
   Method m( Operation( Operation::ConcreteOp(v) ) );    

   test(m);
   return 0;
}

编译错误如下:

 invalid initialization of reference of type «const Method&» from expression of type «Method(Operation (*)(Operation::ConcreteOp))»
    test(m);
         ^

在我的工作项目中,编译错误的开始有所不同:

 no matching function for call to «Program::Ship::testMethod(Program::Object::Transformation::Method (&)(Program::TransformOperation))»
      testMethod(m);
                  ^

同时编译以下代码没有问题:

int main()
{
   Vector v(2, 2);
   Method m( Operation( Operation::ConcreteOp(Vector(2, 2) /* v*/ ) ) );

   test(m);
   return 0;
}

还有两个括号可以解决问题:

int main()
{
   Vector v(2, 2);
   Method m( (Operation( Operation::ConcreteOp(/*Vector(2, 2)*/ v ) ) ) );
   //        ^                                                        ^ 

   test(m);
   return 0;
}

出什么问题了?

1 个答案:

答案 0 :(得分:4)

Method m( Operation( Operation::ConcreteOp(v) ) );

这将声明一个名为m的函数,返回Method并将该函数作为参数;它没有声明名为m的变量。使用大括号,如下所示:

Method m { Operation( Operation::ConcreteOp(v) ) };

另请参阅:most vexing parse