Возможно, явное преобразование типов приводит к ошибке компиляции C

#c

#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 Vectoramp; v) : v_(v){}

   private:
      Vector v_;
   };

   Operation(const ConcreteOpamp; op) : op_(op){}

private:
   ConcreteOp op_;   
};        

class Method
{
public:
   Method(const Operationamp; op) : op_(op){}

private:
   Operation op_;
};        

void test(const Methodamp; m)
{
}

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

   test(m);
   return 0;
}
  

ошибка компиляции выглядит следующим образом:

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

В моем рабочем проекте ошибка компиляции начинается немного по-другому:

  no matching function for call to «Program::Ship::testMethod(Program::Object::Transformation::Method (amp;)(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:

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

При этом объявляется функция с именем m , возвращающая Method и принимающая функцию в качестве параметра; она не объявляет переменную с именем m . Используйте фигурные скобки, например:

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

Смотрите также: самый неприятный синтаксический анализ

Комментарии:

1. Интересно, пришло ли время, чтобы «самый неприятный синтаксический анализ» получил свой собственный тег? И, говоря от имени C -файла, чертовски жаль, что в других языках нет чего-то подобного, что мы могли бы использовать в ответ…