#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 -файла, чертовски жаль, что в других языках нет чего-то подобного, что мы могли бы использовать в ответ…